N维世界 2024-05-03 15:10 采纳率: 90%
浏览 3
已结题

洛谷p1055 问题提问

img


#include <stdio.h>
#include <string.h>

int main(){
    char test[13];
    scanf("%13s", test);
        
    int longer = strlen(test);
    int num = 0;
    char *flag = test;
    int i = 0;
    int j = 1;
    
    for(i = 0; i < longer - 1; i++){
        if((*flag >= '0') && (*flag <= '9')){
            num = num + (*flag - '0') * j;
            j++;
        }
        flag++;
    }
    int end = *flag - '0';
    int mou = num % 11;
    
    if(end == mou){
        printf("Right");
    }
    else{
        if(mou == 10){
            *flag = 'X';
            printf("%s", test);    

        }
        else{
            *flag = mou + '0';
            printf("%s", test);    
        }
    }
    return 0;
}

为什么这个有几个测试点过不了,请问问题出在哪里

  • 写回答

3条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2024-05-03 15:11
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    这段代码是实现一个校验身份证号码是否正确的功能,但是代码中有一个问题:身份证号码的最后一位可能是数字也可能是字母X,但是代码中只考虑了数字情况,没有考虑X的情况,因此当输入的身份证号码最后一位是X时,会出现错误,导致部分测试点无法通过。 解决办法是在判断校验位时增加对X的特判。具体来说,可以将判断校验位的部分代码修改如下:
    int end = *(flag + 1) == 'X' ? 10 : *(flag + 1) - '0'; // 判断校验位是否为X,并转换为数字(X为10)
    int mou = num % 11;
    if (end == mou) {
        printf("Right");
    } else {
        if (mou == 10) {
            *(flag + 1) = 'X'; // 将校验位改为X
            printf("%s", test);
        } else {
            *(flag + 1) = mou + '0'; // 将校验位改为数字
            printf("%s", test);
        }
    }
    

    修改后的完整代码如下:

    #include <stdio.h>
    #include <string.h>
    int main() {
        char test[13];
        scanf("%13s", test);
        int longer = strlen(test);
        int num = 0;
        char *flag = test;
        int i = 0;
        int j = 1;
        for (i = 0; i < longer - 1; i++) {
            if ((*flag >= '0') && (*flag <= '9')) {
                num = num + (*flag - '0') * j;
                j++;
            }
            flag++;
        }
        int end = *(flag + 1) == 'X' ? 10 : *(flag + 1) - '0'; // 判断校验位是否为X,并转换为数字(X为10)
        int mou = num % 11;
        if (end == mou) {
            printf("Right");
        } else {
            if (mou == 10) {
                *(flag + 1) = 'X'; // 将校验位改为X
                printf("%s", test);
            } else {
                *(flag + 1) = mou + '0'; // 将校验位改为数字
                printf("%s", test);
            }
        }
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月14日
  • 已采纳回答 5月6日
  • 创建了问题 5月3日