C语言:生成校验码

题目描述

某商品的编号是有11位字符串组成,前10位的每一位都是一个0~9之间的数字,最后一位是一个校验码。校验码为0~10之间的数值,如果等于10,用大写"X"表示。校验规则如下:

sum=∑(ci×wi),其中ci是字符对应的数值,wi是对应的位权。将和值对11取余,如果余数为0,则表示该编号正确,否则编号有误。

从第一位开始到第11位的位权依次为:{29,23,19,17,13,11,7,5,3,2,1}

例如编号"15975374136",依据上述规则,其sum=1×29+5×23+9×19+7×17+5×13+3×11+7×7+4×5+1×3+3×2+6×1=616,
616 mod 11=0,所以这是一个正确的编码。
类似的:3574186412X,78952147854,65892147891,96547123698都是正确的编码。
现在,给定这个编码的前面10位,请编程求出第11位校验码。如果校验码等于10的话,用大写的"X"表示。

提示

输入输出格式

输入格式

一行,由10个数字组成的字符串
输出格式

一个字符,表示所求的校验码

复制代码
#include <stdio.h>
#include <string.h>
#include <math.h>

int check(char arr[11])
{
	int weight[11]={29,23,19,17,13,11,7,5,3,2,1};
	int sum=0;
	int i;
	for(i=0;i<10;i++)
	{
		sum+=(arr[i]-'0')*weight[i];
	}
	
	int reminder=sum%11;
	
	if(reminder==0)
	{
		return 0;
	}else if(reminder==10)
	{
		return 10;
	}else{
		return 11-reminder;
	}
}

int main()
{
	char str[11];
	gets(str);
	
	int end=check(str);
	if(end==10)
	{
		printf("%c",'X');
	}else{
		printf("%d",end);
	}
	return 0;
}
相关推荐
Lazionr7 小时前
stack与queue:底层实现与容器适配器
开发语言·数据结构·c++
Hello_Damon_Nikola7 小时前
CH573从入门到精通
c语言·开发语言·单片机·嵌入式硬件
Logintern097 小时前
Langgraph使用MemorySaver建立有记忆的图
开发语言·windows·python
豆沙沙包?7 小时前
C++~~~vector容器(p31-P40)
开发语言·c++
必须会一定会7 小时前
GLM-5.3 迁移实战:强制思考、1M 上下文与官方编程基准
android·开发语言·kotlin
牛油果子哥q8 小时前
C++STL容器详解:vector/list/string底层扩容、迭代器失效终极解决、容器选型避坑
开发语言·c++·list
meilindehuzi_a8 小时前
Next.js 全栈基础实战:从 SPA、SSR 到 App Router 与 Todo API
开发语言·javascript·ecmascript
Chen—LSN8 小时前
C语言——数据在内存中的存储
c语言·开发语言·经验分享·笔记
caimouse8 小时前
ReactOS 图形系统分析(24):指针(光标)管理 — mouse.c/h
c语言·开发语言
上玄code8 小时前
【Agent精讲】调一个LLMAPI背后的工程问题
java·开发语言·python·chatgpt