哇哇哇哇池 2024-03-30 19:26 采纳率: 0%
浏览 5

PAT 乙级1031 查验身份证 测试点2无法通过 没有X大小写的问题

PAT 乙级1031 查验身份证 测试点2无法通过 没有X大小写的问题


#include <bits/stdc++.h>
using namespace std;
char sentence[25];
int weight[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char M[11]={'1','0','X','9','8','7','6','5','4','3','2'};
int main(){
    int n,flag=1;
    scanf("%d",&n);
    getchar();
    while(n--){
        int sum=0;
        scanf("%s",sentence);
        if(n!=0) getchar();
        for(int i=0;i<=16;i++){
            if(sentence[i]>='0'&&sentence[i]<='9'){
                sum+=(sentence[i]-'0')*weight[i];
            }else{
                flag=0;
                printf("%s\n",sentence);
                break;
            }
        }
        int z=sum%11;
        char m=M[z];
        if(sentence[17]!=m){
            flag=0;
            printf("%s\n",sentence);
        }
    }
    if(flag==1)
        printf("All passed");
    return 0;
}
  • 写回答

2条回答 默认 最新

  • 关注

    晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    根据您提供的代码,您在比较身份证号码最后一位与校验码时,没有考虑到大小写的问题。在身份证校验码中,校验码可以是大写字母X。因此,在比较时,您需要将输入的校验码转换为大写字母后进行比较。以下是修改后的代码:
    #include <bits/stdc++.h>
    using namespace std;
    
    char sentence[25];
    int weight[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
    char M[11] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
    
    int main() {
        int n, flag = 1;
        scanf("%d", &n);
        getchar();
        while (n--) {
            int sum = 0;
            scanf("%s", sentence);
            if (n != 0) getchar();
            for (int i = 0; i <= 16; i++) {
                if (sentence[i] >= '0' && sentence[i] <= '9') {
                    sum += (sentence[i] - '0') * weight[i];
                } else {
                    flag = 0;
                    printf("%s\n", sentence);
                    break;
                }
            }
            int z = sum % 11;
            char m = M[z];
            if (toupper(sentence[17]) != m) { // 转换为大写字母进行比较
                flag = 0;
                printf("%s\n", sentence);
            }
        }
        if (flag == 1)
            printf("All passed");
        return 0;
    }
    

    通过在比较前使用toupper()函数将输入的校验码转换为大写字母,您可以确保正确比较身份证号码的最后一位校验码。这样,您应该能够通过PAT乙级1031题目的第二个测试点。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月30日

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境