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

来源:互联网 发布:关于大学生网络的论文 编辑:程序博客网 时间:2024/06/16 19:54

刚注册了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

4205831989060400142058319890604001042058319890604001X

Sample Output

420583198906040010TrueFalse

源代码:

#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");elseprintf("False\n");}}return 0;}

刚开始还不明白对11取模是什么意思,现在了解了,是对11求余,嘿嘿,再接再厉吧,ACM编程的新手。。。。



原创粉丝点击