描述
校验码(jiào yàn mǎ)通常是一组数字的最后一位,由前面的数字通过某种运算得出,用以检验该组数字的正确性。常见的校验码有中华人民共和国居民身份证的最后一位、ISBN号码的最后一位、组织机构代码的最后一位、数据传输的正确性验证码等。
代码作为数据在向计算机或其它设备进行输入时,容易产生输入错误,为了减少输入错误,编码专家发明了各种校验检错方法,并依据这些方法设置了校验码。
算术极数法(Arithmetic method)
数字12345 每位对应极数5 4 3 2 1 所以校验码:15+24+33+42+51=35%11=2;
几何极数法(Geometric method)
数字12345 对应极数 16 8 4 2 1所以校验码:116+28+34+42+51=57%11=2;
质数法(Prime number method)
数字12345 对应极数11 7 5 3 2 所以校验码:111+27+35+43+5*2=62%11=7;
输入
输入数据有T组(T<100)
对于每组数据:
第一行输入一个数字(长度不超过10000)
第二行输入一段字符串,字符串有三种:第一种‘Arithmetic’,二种‘Geometric’,第三种‘Prime’
输出
对于每组数据输出一个校验码,当校验码为10时输出‘X’;
样例输入
3
12345
Arithmetic
12345
Geometric
12345
Prime
样例输出
2
2
7
//
#include<stdio.h>
#include<string.h>
int d[110000];
int main()
{
int a[10005],b[10005],c[10005];
b[1]=1;a[1]=1;
int i,j;
for(i=2;i<=10000;i++)
{
a[i]=i%11;
b[i]=b[i-1]*2%11;
}
memset(d,0,sizeof(d));
int k=1;
for(i=2;;i++)
{
if(d[i])
continue;
if(k>10000)
break;
c[k++]=i%11;
for(j=i*2;j<=110000;j+=i)
d[j]=1;
}
int t;
char s[10005];
char ss[1000];
scanf("%d",&t);
while(t--)
{
int sum=0;
scanf("%s%s",s,ss);
int l=strlen(s);//这里要注意,如果循环中直接用strlen的话会超时
if(strcmp(ss,"Arithmetic")==0)
{
for(i=0;i<l;i++)
{
sum+=(s[i]-'0')*a[l-i];
sum%=11;
}
}
else if(strcmp(ss,"Geometric")==0)
{
for(i=0;i<l;i++)
{
sum+=(s[i]-'0')*b[l-i];
sum%=11;
}
}
else
{
for(i=0;i<l;i++)
{
sum+=(s[i]-'0')*c[l-i];
sum%=11;
}
}
if(sum==10)
printf("X\n");
else
printf("%d\n",sum);
}
}