该答案完全符合题目要求,该题的特点是输出要按身份证+结果的方式,并且要求全数字输入
#include <stdio.h>
#include <string.h>
char fun(int n);
int res[17] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };
int main()
{
int n; // n验证次数
char result; // 最后一位校验码
scanf("%d", &n);
getchar();
char id[18];
for (int i = 0; i < n; i++)
{
int count = 0;
for (int m = 0; m < 18; m++)
{
scanf("%c", &id[m]);
}
getchar();
for (int m = 0; m < 18; m++)
{
if (id[m] >= '0' && id[m] <= '9')//题目要求必须输入18位数字
{
count++;
}
printf("%c", id[m]);
}
printf(" ");
if (count != 18)
{
printf("Fail\n\n");
continue;
}
else
{
int k = 0;
for (int j = 0; j < 17; j++)
{
k += (id[j] - '0') * res[j];
}
k = k % 11;
result = fun(k);
if (id[17] == result)
{
printf("Passed\n\n");
}
else printf("Fail\n\n");
}
}
return 0;
}
char fun(int n) //z值与M值对应 当然也可以一维数组,不过为了更好的匹配,于是用switch语句
{
switch (n) {
case 0: return '1';
case 1: return '0';
//case 2: return 'X'; //题目要求删掉2对应的X
case 3: return '9';
case 4: return '8';
case 5: return '7';
case 6: return '6';
case 7: return '5';
case 8: return '4';
case 9: return '3';
case 10:return '2';
}
return -1; //不会返回这个值的
}
运行结果:
代码如下:
#include<stdio.h>
int main()
{
int i = 0;
int n = 18;
int qz[17] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };
char sfz[20]={0};
int sum = 0;
int gjr = 0;
int N = 0;
int m = 0;
int q = 0;
scanf("%d", &N);
for (i = 0; i < N; i++)
{
scanf("%s", sfz);
sum = 0;
for (q = 0; q < 17; q++)
{
gjr = (sfz[q] - '0') * qz[q];
sum = gjr + sum;
}
sum = sum % 11;
switch (sum)
{
case 0:
if (sfz[17] == '1') printf("Passed\n");
else printf("Fail\n");
break;
case 1:
if (sfz[17] == '0') printf("Passed\n");
else printf("Fail\n");
break;
case 3:
if (sfz[17] == '9') printf("Passed\n");
else printf("Fail\n");
break;
case 4:
if (sfz[17] == '8') printf("Passed\n");
else printf("Fail\n");
break;
case 5:
if (sfz[17] == '7') printf("Passed\n");
else printf("Fail\n");
break;
case 6:
if (sfz[17] == '6') printf("Passed\n");
else printf("Fail\n");
break;
case 7:
if (sfz[17] == '5') printf("Passed\n");
else printf("Fail\n");
break;
case 8:
if (sfz[17] == '4') printf("Passed\n");
else printf("Fail\n");
break;
case 9:
if (sfz[17] == '3') printf("Passed\n");
else printf("Fail\n");
break;
case 10:
if (sfz[17] == '2') printf("Passed\n");
else printf("Fail\n");
break;
default:
printf("Fail\n");
break;
}
}
return 0;
}
#include <stdio.h>
#include <string.h>
char fun(int n);
int res[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
int main()
{
int n,count,both=0; // n验证次数 count 局部变量,输出错误的身份证号 both 检验是否全部正确,输出ALL passed
char result; // 最后一位校验码
scanf("%d",&n);
getchar();
char id[n][18];
for(int i=0;i<n;i++)
{
scanf("%s",id[i]);
}
//验证前17位数字
for(int i=0;i<n;i++)
{
count=0;
for(int a=0;a<17;a++)
{
if(id[n][a]<'0'&&id[n][a]>'9')
{
count++;
}
}
if(count>0)
{
for(int l=0;l<18;l++)
printf("%c",id[i][l]);
printf("\n");
both++;
}
//进行下一步验证
if(count==0)
{
int k=0;
for(int j=0;j<17;j++)
{
k+=(id[i][j]-'0')*res[j];
}
k=k%11;
result=fun(k);
if(id[i][17]!=result)
{
for(int l=0;l<18;l++)
printf("%c",id[i][l]);
printf("\n");
both++;
}
}
}
if(both==0)
{
printf("All passed");
}
return 0;
}
char fun(int n) //z值与M值对应 当然也可以一维数组,不过为了更好的匹配,于是用switch语句
{
switch (n) {
case 0: return '1';
case 1: return '0';
case 2: return 'X';
case 3: return '9';
case 4: return '8';
case 5: return '7';
case 6: return '6';
case 7: return '5';
case 8: return '4';
case 9: return '3';
case 10:return '2';
}
return "hello World"; //不会返回这个值的
}
#include<stdio.h>
#include<string.h>
int main()
{
int n;
scanf("%d",&n);
int weights[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
//printf("%d",weights[1]);
int match[] = {1,0,9,8,7,6,5,4,3,2};
char result[20];
char number[20];
char number2[20];
for(int i = 0;i < n;i++){
scanf("%s",number);
scanf("%s",number2);
int weight_sum = 0;
for(int j = 0;j < 17;j++){
int value = number[j] - '0';
weight_sum = weight_sum + value * weights[j];
}
//printf("sum = %d\n",weight_sum);
int res = weight_sum % 11;
//取模
//printf("%d\n",res);
if(res <= 1){
res=res-1;
}
res = match[res];
int final = number2[17] - '0';
if(final == res){
printf("Passed\n");
}else{
printf("Fail\n");
}
}
return 0;
}