c语言pat基础题改错0816L1016

img

img


我的代码出现问题,本题希望可以得到大家的指导,谢谢你的帮助!

供参考:

#include <stdio.h>
int main() 
{
    int  coeff[17] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };  // 系数数组
    char crc[11] = { '1','0','X','9','8','7','6','5','4','3','2' };// 校验码数组

    int N = 0, sum = 0, flag = 0, n = 0;
    scanf("%d", &N);    
    for (int i = 0; i < N; i++) {
        sum = 0;    
        char num[18];  
        scanf("%s", num);  // 输入身份证号码,存储到字符数组num3中
        for (int j = 0; j < 17; j++)// 计算前17位数字乘以系数的和
            sum += (num[j] - '0') * coeff[j];
        n = sum % 11;   // 取余得到校验码的下标
        if (num[17] != crc[n]) {  // 检查校验码是否合法
            puts(num);  // 输出不合法的身份证号码
            flag = 1;   // 如果不合法,将标志位置为1
        }
    }
    if (flag == 0)
        printf("All passed");
    return 0;
}

把你代码放上来看看才知道哪里有问题啊

【以下回答由 GPT 生成】

首先,我们可以将校验码计算封装成一个函数,方便后续调用和重复使用。

def calculate_check_code(id_number):
    weights = [1, 9, 7, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    checksum = 0
    for i in range(17):
        checksum += int(id_number[i]) * weights[i]
    # 求模运算
    checksum %= 11
    # 根据模的结果返回对应的校验码
    check_code_list = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
    return check_code_list[checksum]

接下来,我们可以对输入的身份证号码进行逐个校验。

n = int(input())
invalid_ids = []  # 存储有问题的身份证号码

for _ in range(n):
    id_number = input()
    if not id_number[:-1].isdigit() or not id_number[-1].isalnum() or len(id_number) != 18:
        invalid_ids.append(id_number)  # 身份证号码长度不正确或包含非数字、非字母的字符
    elif id_number[-1].upper() != calculate_check_code(id_number[:-1]):
        invalid_ids.append(id_number)  # 校验码计算不正确

if len(invalid_ids) == 0:
    print("A11")
else:
    for id_number in invalid_ids:
        print(id_number)

这样,我们就能根据输入的身份证号码,逐个检查校验码的有效性并输出有问题的号码。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^