1.检测前17位中是否全为数字,最好单个单个字符检测,利用ASCII码值是否在48-57(0-9)之间判断是否为数字,其余的便为字符(因为所给的号码不确定会有什么字母/数字)
2.同时让获取的判断为数字的各个字符乘以相应的权重,mod11后得到z
3.转换z对应的M值与获取的最后一个字符进行校验
4.可设置一个信号量判断是否全部正常
# include结果: Plus:# include using namespace std; int getz(string num) { const int W[17] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; int n=0; for (int j = 0; j< 17;j++) { int tmp = (int)num[j]; if (tmp >= 48 && tmp <= 57) { n += W[j]*(tmp-48); continue; } else { return 11; } } return n%11; } int main() { const string M[11] = {"1","0","X","9","8","7","6","5","4","3","2"}; int N,k=0; cin>>N; string number=""; bool flag = false; int z=-1; int getz(string num); while(k cin>>number; z = getz(number); if(z>=0&&M[z]!=number.substr(number.size()-1,number.size())||z==11) { flag = true; cout< >number; z = getz(number); if(z>=0&&M[z]!=number.substr(number.size()-1,number.size())) { flag = true; cout< cout<<"All passed"; } return 0; }
注意:
不要直接用stoi(“xxx”)函数,否则遇到字母会报错,以及遇到“0xx”的转换可能会出问题
其它解法(搬运):
https://blog.csdn.net/WWIandMC/article/details/106851349
https://blog.csdn.net/masteren/article/details/90245894



