problemdetail.do?&method=showdetail&id=5131

toj5131:校验码

描述
校验码(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所以校验码:1
16+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
#include
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

你可能感兴趣的:(每天一总结,c-c++)