题目描述
第二代身份证号为18位,我们将身份证号定义为ID=a17a16⋯a0¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯,那么前17位ai,i=17,为数字0∼9,最后一位为校验位,为0∼9和X,X表示数值10。 校验公式为
∑i=017ai×2i≡1(mod11)
请写一个程序,对用户输入的身份证号码进行校验。
输入
第一行是一个整数K(K≤1000),表示样例的个数。 以后每行是一个18位的字符串,前17位为数字,最后一位为数字或者字母X。
输出
每个样例输出一样。如果校验通过,输出“Yes”,否则输出“No”。
样例输入
3 431381198109106573 43138119870827275X 431381198708272759
样例输出
Yes Yes No
思路:题目不难,但是易错,注意字符串数组下标和题目给出公式的对应关系
#include<stdio.h>
#include<math.h>
char str[20];
int main() {
int n;
scanf("%d", &n);
while (n--) {
scanf("%s", str);
int sum = 0;
for (int i = 0, j = 17; i <= 17; i++, j--) {
//字符‘X’的数值是10,转化成等价字符就是10+'0'
if (str[i] == 'X') str[i] = 10 + '0';
sum += (str[i] - '0') * pow(2, j);
}
if (sum % 11 == 1) printf("Yes\n");
else printf("No\n");
}
return 0;
}