思路
分步处理,先处理字符数组化整形
求z值,
需注意,加权求和是乘算!
判段z对应的校验位是否与数据相同
代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define mem(x,y) sizeof(x,y,sizeof(x))
using namespace std;
char a[20],b[20];
int pow[20]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
int zw[12]={1,0,10,9,8,7,6,5,4,3,2}; //假设X为10
int main() {
int n,flag=0;//flag 判段整体对错
scanf("%d",&n);
while(n--) {
int f=0; //f判段该项对错
mem(a,0),mem(b,0);
scanf("%s",a);
strcpy(b,a);
//<1>处理b中有字母X,以及字符转数字(X~10)
for(int i=0; i<18; i++) {
if(b[i]=='X') {
if(i!=17) {f=1;break;}
else {b[i]-='0';b[i]=10;} //X化10
} else b[i]-='0';
}
//<2>计算z,判段zw[z]与b[17]是否相等
int z=0;
for(int i=0; i<17; i++)
z+=(pow[i]*b[i]);
if(zw[z%11]!=b[17]) f=1;
if(f) {
flag=1;
printf("%s\n",a);
}
}
if(!flag)
printf("All passed");
return 0;
}