PAT B1031 查验身份证
前言
正文
思路
详见代码注释
参考题解
#include<iostream>
#include<string>
using namespace std;
/*
先用一个字符串数组存放所输入的字符串,然后对每个字符串中进行遍历,
注意需要注意检查前17位是否全为数字,并且最后一位校验码是否正确
*/
int main(){
int n,w[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};//w[i]表示第i+1位数字的权重
char map[11]={'1','0','X','9','8','7','6','5','4','3','2'};//map数组存储映射值
bool flag=true;
string str[100];
cin>>n;
for(int i=0;i<n;i++){
cin>>str[i];
int j,sum=0;
for(j=0;j<17;j++){
if(str[i][j]<'0'||str[i][j]>'9'){//前17位含有非数字字符
break;
}
sum+=w[j]*(str[i][j]-'0');
}
if(map[sum%11]!=str[i][17]||j<17){
//含有非数字字符或者验证码不对
flag=false;
cout<<str[i]<<endl;
}
}
if(flag)cout<<"All passed"<<endl;
return 0;
}