题意:共18个数,前面17个数每个数只能在0到9的范围,不能出现'X',出现就是错的,错的输出,第二种情况是,算出前面17位数和权的乘积之和,求11的余,根据这个余数对应校验码,不相等就输出;
注意点:18位数的数就不要用Int或者long long存了,要考虑要用字符串,这题比较像前面b1021;
代码(柳神):
#include<iostream>
#include <cstring>
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(){//定义的时候不要忘记括号;bool+变量名+();
int sum=0;
for(int i=0;i<s.length()-1;i++){
if(s[i]<'0'||s[i]>'9'){
return false;
}else {
sum+=a[i]*(s[i]-'0');
}
}
int temp=(s[17]=='X')?10:s[17]-'0';//
return b[sum%11]==temp;//真的时候返回true,否则返回false;
}
int main(){
int n,flag=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>s;
if(!istrue()){//if()是为真的时候执行,if(!)就是为假的时候执行,bool返回false就是假的时候;
cout<<s<<endl;
flag=1;
}
}
if(flag==0){
cout<<"All passed";
}
return 0;
}