题目 身份证的奥秘
题述无关部分已略
(1)十七位数字本体码加权求和公式
S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和
Ai: 表示第i位置上的身份证号码数字值
Wi: 表示第i位置上的加权因子
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
(2)计算模Y = mod(S, 11)
(3)通过模得到对应的校验码
Y: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2
15 位的 yy 年升为 18 位后,变成 19yy年,但对于百岁以上老人, 则为 18yy 年,此时,他们的最后三位顺序码为996, 997, 998 或 999 来标记。
输入格式:
输入n组身份证号码,第一行为个数,以后每行为身份证号码。
输出格式:
如果输入的身份证号码为15位,则将其升级为18位后显示输出;否则判断其是否为合法身份证号,并逐行输出。
输入样例:
4
350622197904130331
11010519491231002X
110105491231002
110105491231996[回车]
输出样例:
Invalid[回车]
Valid[回车]
11010519491231002X[回车]
110105184912319965[回车]
我的代码
#include<stdio.h>
#include<string.h>
int main()
{
int n,i,j,s=0,y,l[100]; char a[100][20];
int quan[17]= {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char code[11]={'1','0','X','9','8','7','6','5','4','3','2'};
scanf("%d\n",&n);
for(i=0;i<n;i++)
{
gets(a[i]);
l[i]=strlen(a[i]);
}
for(i=0;i<n;i++)
{
if(l[i]==18)
{
for(j=0;j<17;j++)
{
s=s+(quan[j])*(a[i][j]-48);
}
y=s%11;
if(code[y]==a[i][17]) printf("Valid\n");
else printf("Invalid\n");
}
if(l[i]==15)
{
if(a[i][12]=='9'&&a[i][13]=='9'&&(a[i][14]=='6'||a[i][14]=='7'||a[i][14]=='8'||a[i][14]=='9'))
{
for(j=14;j>7;j--)
{
a[i][j]=a[i][j-2];
}
a[i][6]='1';a[i][7]='8';
}
else
{
for(j=14;j>7;j--)
{
a[i][j]=a[i][j-2];
}
a[i][6]='1';a[i][7]='9';
}
for(j=0;j<17;j++)
{
s=s+(quan[j])*(a[i][j]-48);
}
y=s%11;
a[i][17]=code[y];
a[i][18]='\0';
printf("%s\n",a[i]);
}
s=0;
}
return 0;
}
但一直有两个测试用例过不了,求解惑