校验
题目描述
第二代身份证号为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
**解题思路:**在ASCII码表中," : " 是在 ' 9 ' 之后的一个字符,所以用 ' : ' 替代 ' X ' 。
另外注意题目 a0 和 a17 的顺序,是a17在前面。(应该就我没看题.....) ,剩下的直接按校验公式 计算就行。
AC代码:
cpp
#include <stdio.h>
int K,tag;
int two[20] = {1};
char Id[20];
int main()
{
for (int i = 1; i < 18; i ++) // 2的次幂
two[i] = two[i-1]*2;
scanf("%d",&K);
while ( K --)
{
tag = 0;
scanf("%s",Id);
if (Id[17] == 'X') Id[17] = ':'; // 利用ASCII码
for (int i = 0; i < 18; i ++) // 求和
tag += (Id[i]-'0')*two[17-i];
if (tag%11 != 1) puts("No");
else puts("Yes");
}
return 0;
}