您的位置:首页 > 其它

第一次测试&第一篇CSDN日志

2013-06-05 18:04 267 查看
刚注册了CSDN,还不太会用,以前也没有天天写博客的习惯,不过慢慢养成吧!前不久刚完成了12网络 第一次测试的题目,前几题比较简单,最后一题倒是花了不少功夫,现在的我编程能力很差,渐渐从基础题训练吧!

这就是第五题,题目看了3,4遍才看懂!

密码学家亘古教授,破解了居民身份证号的密码,他可以分辨出身份证号的真假,还能猜出你身份证最后一位数字。下面是亘古教授计算身份证号末位的办法

1.计算校验位

∑(id[i]×Sec[i])(mod 11) //身份证前17位乘对应的校验位的和,对11取模

Sec[17] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}

2.通过校验位得出真实数字

校验位  0 1 2 3 4 5 6 7 8 9 10

真实数字 1 0 X 9 8 7 6 5 4 3 2

亘古教授想请我们HBUT的天才们设计一个程序,当输入身份证号前17位时补全第18位,当输入18位身份证号时验证它的真假

Input
输入17位或者18位长度的N行字符串
Output
当输入的18位身份证为真时输出 True

当输入的18位身份证为假时输出 False

当输入身份证前17位时完整输出该身份证号码
Sample Input

42058319890604001
420583198906040010
42058319890604001X


Sample Output

420583198906040010
True
False


源代码:

#include <stdio.h>
#include <math.h>
int main()
{
char id[18];
int i,k,idnum[17];
int sec[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char yan[11]={'1','0','X','9','8','7','6','5','4','3','2'};
while(scanf("%s",&id)!=EOF)
{

if(id[17]=='\0')
{
for(i=0;i<17;i++)
{
switch(id[i])
{
case '0':idnum[i]=0;break;
case '1':idnum[i]=1;break;
case '2':idnum[i]=2;break;
case '3':idnum[i]=3;break;
case '4':idnum[i]=4;break;
case '5':idnum[i]=5;break;
case '6':idnum[i]=6;break;
case '7':idnum[i]=7;break;
case '8':idnum[i]=8;break;
case '9':idnum[i]=9;break;
}
}
k=(idnum[0]*7+idnum[1]*9+idnum[2]*10+idnum[3]*5
+idnum[4]*8+idnum[5]*4+idnum[6]*2+idnum[7]*1
+idnum[8]*6+idnum[9]*3+idnum[10]*7+idnum[11]*9
+idnum[12]*10+idnum[13]*5+idnum[14]*8+idnum[15]*4+idnum[16]*2)%11;

id[17]=yan[k];
for(i=0;i<18;i++)
{
printf("%c",id[i]);
}
printf("\n");
}

else
{
for(i=0;i<17;i++)
{
switch(id[i])
{
case '0':idnum[i]=0;break;
case '1':idnum[i]=1;break;
case '2':idnum[i]=2;break;
case '3':idnum[i]=3;break;
case '4':idnum[i]=4;break;
case '5':idnum[i]=5;break;
case '6':idnum[i]=6;break;
case '7':idnum[i]=7;break;
case '8':idnum[i]=8;break;
case '9':idnum[i]=9;break;
}
}
k=(idnum[0]*7+idnum[1]*9+idnum[2]*10+idnum[3]*5
+idnum[4]*8+idnum[5]*4+idnum[6]*2+idnum[7]*1
+idnum[8]*6+idnum[9]*3+idnum[10]*7+idnum[11]*9
+idnum[12]*10+idnum[13]*5+idnum[14]*8+idnum[15]*4+idnum[16]*2)%11;

if(id[17]==yan[k])
printf("True\n");
else
printf("False\n");
}
}
return 0;
}


刚开始还不明白对11取模是什么意思,现在了解了,是对11求余,嘿嘿,再接再厉吧,ACM编程的新手。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: