供参考:
#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)
这样,我们就能根据输入的身份证号码,逐个检查校验码的有效性并输出有问题的号码。
【相关推荐】