问题如下:
输入格式:
只有一行,为一个长度不超过1000且仅包含数字的字符串。
输出格式:
为上述规则下该字符串的校验和。测试用例保证所有整数可以用 int存储。
输入样例:
85302688978758327
输出样例:
21
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char string[1000];
int a[17]={13,16,30,17,8,24,21,3,9,12,10,4,6,14,15,29,11};
int i,l,sum=0;
scanf("%s",string);
l=strlen(string);
for(i=0;i<l;i++)
{
sum=sum+(string[l-1-i]-'0')*a[(l-1-i)%17];
}
printf("%d",sum%23);
}
以此题为例:
21
修改如下,供参考:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char string[1000];
int a[17]={13,16,30,17,8,24,21,3,9,12,10,4,6,14,15,29,11};
int i,l,sum=0;
scanf("%s",string);
l=strlen(string);
for(i=0;i<l;i++)
{
sum+=(string[l-1-i]-'0')*a[(i+1)%17]; //从低位向高位数,低位 n 从1 开始
//sum=sum+(string[l-1-i]-'0')*a[(l-1-i)%17];
}
printf("%d",sum%23);
return 0;
}
思路:先翻转字符串,然后依次对乘积相加。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char string[1000];
int a[17] = { 13,16,30,17,8,24,21,3,9,12,10,4,6,14,15,29,11 };
int i, l, sum = 0;
scanf("%s", string);
l = strlen(string);
char *pStr = _strrev(string); //add
printf("%s\n", pStr); //add
for (i = 0; i < l; i++)
{
//sum = sum + (string[l - 1 - i] - '0') * a[(l - 1 - i) % 17];
sum = sum + (pStr[i]-'0') * a[(i+1) % 17]; // modify
}
printf("%d", sum % 23);
return 0;
}