c++---天梯赛---查验身份证
★题目:
★题目分析:本题要求输入一个数字n,随后n行输入n个身份证号码。之后进行进一步的判断把错误的身份证号码输出。如果全部正确输出All passed。
★思路方法:
①按题目要求输入。
②对前17位进行判断,若出现错误字符则将之存入待输出位置。
③对前17位进行加权处理并对11取模。
④找到第18位应该是的字符并且和身份证上实际的字符进行比较。
⑤对所有情况综合处理并按要求输出。
★注意:身份证共18位,实际字符应与a【17】进行比较
★代码解释:
#include<stdio.h> int main() { int PAN(char a[18]); //对身份证号码的正确性进行判断 char a[100][18]; //用于存放所输入的身份证号码 int b[100]; int n,i,j,o; int t; //用于判断身份证 int s=0; //用于统计正确身份证的数量 scanf("%d",&n); for(i=0;i<n;i++) { scanf("%s",a[i]); t=PAN(a[i]); b[i]=t; if(t==1) s++; t=0; } if(s!=n) //此时所输入的身份证号码不全部都正确 for(j=0;j<i;j++) { if(b[j]==0) { for(o=0;o<=17;o++) printf("%c",a[j][o]); printf("\n"); } //对不正确的身份证号码进行输出 } else printf("All passed\n"); //全部正确的情况 } int PAN(char a[18]) { int i,t=1,s=0,z; int b[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; char c[11]={'1','0','X','9','8','7','6','5','4','3','2'}; char d; for(i=0;i<17;i++) if(a[i]<'0'||a[i]>'9') {t=0;break;} //对前17位进行判断 if(t!=0) { for(i=0;i<17;i++) s=s+(a[i]-'0')*b[i]; z=s%11; d=c[z]; //身份证第18位应为的字符 } if(d!=a[17]) //应为的与实际的进行比较 t=0; return(t); //若t为1则正确,0则错误 }
★测试结果: