菜鸟在ACM的成长 身份证验证代码

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

#include <stdio.h>

#include <math.h>
int  main()
{
char id[18];
int i,c,idnum[17];
int sec[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char Com[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;
}
}
c=(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]=Com[c];
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;
}
}
c=(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]==Com[c])
printf("True\n");
else
printf("False\n");
}
}
return 0;

}

本题中需要注意的几点内容(或者说我学习到的一点儿新知识)

1.首先在这里对于字符串的循环输入while(scanf("%s",&id)!=EOF),本身我用的是while(gets(id)!=EOF),虽然在编译器上运行没有错误,但是提交后会显示编译错误,错误的原因应该是由于代码的非标准化  我用的是G++的编译环境提交的,以后需要注意

2.在这道题目当中运用了字符串中的数字与数组的转换,这里使用的是switch case 语句,略显麻烦,但是清晰明了

optis:本题如果用C++的方法来编译的话应该能简化一些,C++中对于string类型的数据处理更加强大

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值