题目
我的思路
首先获取输入的n个身份证号,存进一个数组。遍历数组,进行两个条件判断:①判断前十七位是否都为数字,若是则进入②,否则输出该身份证号码;②判断最后的校验码是否正确。这里需要计算前十七位数字的加权和然后模11,再根据余数求对应的校验码。若校验码验证不成功则输出。这里还需要记录输出了几个身份证号,输出0个则说明都是验证成功的。这时还要输出“All passed”
书上的思路
#include<cstdio>
#include<cstring>
int w[20]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char change[15]={'1','0','X','9','8','7','6','5','4','3','2'};
int main(){
int n;
scanf("%d",&n);
bool flag=true;//若所有身份证都是正确的则flag=true
char str[20];
for(int i=0;i<n;i++){
scanf("%s",str);
int j,sum=0;
for(j=0;j<17;j++){
if(!(str[j]>='0'||str[j]<='9')) break;//非数字
sum=sum+(str[j]-'0')*w[j];
}
if(j<17){
flag=false;
printf("%s\n",str);
}
else{
if(change[sum%11]!=str[17]){
flag=false;
printf("%s\n",str);
}
}
}
if(flag==true){
printf("All passed\n");
}
}
这是书上的代码。
我自己写的代码,还有个bug没调出来o(╥﹏╥)o 而且没有书上的代码简洁
先记录下来
#include<stdio.h>
int main(){
int N;
scanf("%d",&N);
char ids[N+1][19];
for(int i=0;i<=N;i++){
gets(ids[i]);
}
// for(int i=0;i<=N;i++){
// puts(ids[i]);
// }
// for(int i=0;i<=N;i++){
//判断条件一
// for(int j=0;j<17;j++)
// {
// if(ids[i][j]-'0'<0||ids[i][j]-'0'>9)
// {
// puts(ids[i]);
// break;
// }
// else
// {
int sum=0;
int weight[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
for(int i=0;i<=N;i++){
int last=ids[i][17];
for(int j=0;j<17;j++){
printf("ids[i][j]=%c\n",ids[i][j]);
printf("num=%d\n",ids[i][j]-'0');
sum=sum+((int)(ids[i][j]-'0'))*weight[j];
printf("weight[j]=%d\n",weight[j]);
}
printf("sum=%d\n",sum);
int z=sum%11;
char zm[11]={1,0,'X',9,8,7,6,5,4,3,2};
if(zm[z]-last==0){
printf("successful");
}
else
{
printf("unsuccessful");
}
}
// }
// }
// }
}