题目
思路
(1)使用一个test[]数组来录入当前的号码,使用一个wrong[][]来储存所有有问题的号码,再将权值表和最后一位的字符表用数组储存起来,方便运算
(2)每录入一个号码,就计算其权值以及其对应的第十八位字符是否正确,在计算的过程中顺便检测号码中是否有不是数字的字符,如果有,直接将该号码放入wrong数组,否则计算出对应的字符后和第十八位比较,再决定是否放入wrong数组
(3)根据wrong数组的元素数量,打印对应的内容即可
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
int n, i, j, k = 0, res = 0;
scanf("%d", &n);
char test[19];
char(*wrong)[19] = (char(*)[19])malloc(n * sizeof(char[19]));
int rate[17] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };
char std[11] = { '1','0','X','9','8','7','6','5','4','3','2' };
for (i = 0; i < n; i++)
{
scanf("%s", test);
for (j = 0; j < 17; j++)
if (test[j] >= '0' && test[j] <= '9')
res = res + rate[j] * (test[j] - '0');
else
{
strcpy(wrong[k++], test);
break;
}
if (j < 17)//有字符的情况,就不再进行后续处理
{
res = 0;
continue;
}
if (std[res % 11] != test[17])
strcpy(wrong[k++], test);
res = 0;
}
if (k == 0)
printf("All passed");
else
for (i = 0; i < k; i++)
printf("%s\n", wrong[i]);
return 0;
}