#include<iostream>
using namespace std;
int panduan(string&a);//判断前17个是不是都是数字
int add(string&b);//加权求和求z
int seek(int c,string&d);//对照求M
int main()
{
int N,count=0;//身份证的个数
cin>>N;
string c[N];//字符数组
for(int i=0;i<N;i++)
{
cin>>c[i];
if(panduan(c[i])==1)
{
int z=add(c[i]);
if(seek(z,c[i])==1)
{
count++;
}
}
}
if(count==N) cout<<"All passed" <<endl;
return 0;
}
int panduan(string&a)
{ int i;
for( i=0;i<17;i++)
{
if(a[i]>='0' &&(int)a[i]<='9'){}
else
{
cout<<a<<endl;
return 0;
break;
}
}
if(i==17) return 1;
}
int add(string&b)
{
int a[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
int s=0;
for(int i=0;i<17;i++)
{
s+=(b[i]-'0')*a[i]; //注意是字符不是数字
}
int z=s%11;
return z;
}
int seek(int c,string&d)
{
char a[]={'1' ,'0' ,'X' ,'9' ,'8' ,'7' ,'6' ,'5', '4' ,'3' ,'2'};
int b[]={0,1,2,3,4,5,6,7,8,9,10};
for(int i=0;i<11;i++)
{
if(c==b[i])
{
if(d[17]==a[i])
{
return 1;
break;
}
else
{
cout<<d<<endl;
}
}
}
}
感觉我的代码好复杂,这里贴一个大神的代码,仰慕仰慕,C语言实现的
#include<stdio.h>
#include<string.h>
int main()
{
int N;
scanf("%d",&N);
int quan[18] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char jiaoyan[11] = {'1','0','X','9','8','7','6','5','4','3','2'};
bool flag = true;
char id[20];
for(int i = 0;i < N;i++) {
scanf("%s",id);
int j,sum = 0;
for(j = 0;j<17;j++) {
if(!(id[j] >= '0'&&id[j] <= '9')) break;
sum += (id[j]-'0')*quan[j];
}
if(j<17) {
flag = false;
printf("%s\n",id);
} else{
if(jiaoyan[sum % 11] != id[17]) {
flag = false;
printf("%s\n",id);
}
}
}
if(flag == true) printf("All passed\n");
return 0;
}
原文链接:https://blog.csdn.net/dulongxiang/article/details/81808876