输出时第一种情况不对

img

img

img


不知道是哪里错了,改了很多地方,输出时第一个身份证的情况总是不对,麻烦大家帮忙看看

1、last数组里的小写x换成大写
2、if ((int)sfz[17] == (int)last[yu]) //转换为int型进行比较


#include<stdio.h>
int main()
{
    int hang = 0, b = 0, sum = 0, i, j, yu = 0;
    int a[] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };
    char last[] = { '1','0','X','9','8','7','6','5','4','3','2' };  //小写x换成大写
    scanf_s("%d", &hang);
    getchar();
    for (i = 0; i < hang; i++)
    {
        char sfz[1000];
        gets(sfz);
        for (j = 0; j < 17; j++)
        {
            b = ((int)(sfz[j] - '0')) * a[j];
            sum = sum + b;
        }
        yu = sum % 11; 
        if ((int)sfz[17] == (int)last[yu])  //转换为int型进行比较
            printf("right\n");
        else
            printf("wrong\n");
}
return 0;
}

把代码粘贴出来看看,图片的话不方便

供参考:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
int Chk18PaperId (const char *sPaperId)//函数用来判断身份证号校验码是否合法
{
    int  i;
    long lSumQT = 0;
    int  R[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};//加权因子
    char sChecker[11]={'1','0','X','9','8','7','6','5','4','3','2'};//校验码
    if(strlen(sPaperId) != 18) return -1; //检验长度
    for (i=0; i<18; i++)
    {
        if(!isdigit(sPaperId[i]) && !((sPaperId[i] == 'X' || sPaperId[i] == 'x') && i == 17))
        {
            return  -1;//如果身份证号码中某一位不是数字或者X的话,则返回-1,失败
        }
    }
    for (i=0; i<=16;i++)//验证最末的校验码
    {
        lSumQT += (sPaperId[i]-'0')*R[i];
    }
    if (sChecker[lSumQT%11] != sPaperId[17])
    {
        return -1;
    }
    return 0;
}
int main()
{
    int T;
    char Personal_ID[18];
    scanf("%d", &T);
    getchar();
    while (T--){
          gets(Personal_ID);
          if(!Chk18PaperId(Personal_ID))
             printf("right\n");
          else
             printf("wrong\n");
    }
    return 0;
}