查验身份证 (15分)
总结:
- 两个判定:①前17位,全为数字。 ②第18位与校验码匹配。两者全满足为正常身份证号。
- 相反,不满足① 或者(||) 不满足②,都为错误号码,直接输出。
- 字符型数字→整型数字的转换:s[i] - '0'。 例如 '7'-'0'→7
- 本题对结尾有无空格或换行无要求。
代码:
#include <iostream>
#include <cstring>
using namespace std;
int main(){
string s;
int n, cnt=0;
int sum, flag;
char m[12] ={"10X98765432"};
int a[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
cin>>n;
int flag2 =1; //0有不合格号码
for(int i=0; i<n; i++){
cin>>s;
sum = 0;
flag = 1; //1全数字 0不全为数字
for(int j=0; j<17; j++){
if( s[j] < '0' || s[j] > '9'){
flag = 0;
break;
}
sum += ( s[j] - '0') * a[j];
}
if( flag==0 || s[17] != m[sum%11] ) {
cout << s <<endl;
flag2 = 0;
}
}
if( flag2 ){
cout<<"All passed";
}
return 0;
}