分析:设置一个isTrue函数判断身份证号是否正常,如果不正常返回false。
判断每一个给出的身份证号,如果不正常,就输出这个身份证号,并且置flag=1表示有不正常的号码;如果所有的号码都是正常,即flag依旧等于0,则输出All passed;
在isTrue函数中,先判断前17位是否是数字,如果不是,直接return false;如果是,就将当前字符转化为数字并与a[i]相乘,累加在sum中,对于第18位,如果是X要转化为10,比较b[sum%11]和第18位是否相等,如果相等就返回true,不相等就返回false
#include<bits/stdc++.h>
using namespace std;
int a[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
int b[11]={1,0,10,9,8,7,6,5,4,3,2};
string s; //注意全局变量的声明
bool isTrue(){
int sum=0;
for(int i=0;i<17;i++){
if(s[i]<'0'||s[i]>'9'){
return false;
}
sum+=(s[i]-'0')*a[i];
}
int temp=(s[17]=='X')?10:(s[17]-'0');
return b[sum%11]==temp;
}
int main(){
int n,flag=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>s;
if(!isTrue()){
cout<<s<<endl;
flag=1;
}
}
if(flag==0)
cout<<"All passed";
return 0;
}