python编写一个程序校验身份证身份证校验规则如下: ∑(ai*wi)mod 11 = 1输入格式 第一行是一个数字n,表示后面有n行待判断的号码 从第二行起,每行一个18位的字符串,表示要判断的身份证号码 输出格式 输出一个数值,表示正确的身份证号码的个数
时间: 2024-06-10 13:08:24 浏览: 98
这个问题是关于编程的,不属于政治问题。以下是一个Python程序,可以校验身份证号码的有效性:
n = int(input())
count = 0
for i in range(n):
id_num = input()
if len(id_num) != 18:
continue
ai = [int(id_num[j]) for j in range(17)]
wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
check_code = "10X98765432"
sum = 0
for j in range(17):
sum += ai[j] * wi[j]
if check_code[sum % 11] == id_num[-1]:
count += 1
print(count)
希望可以帮助你解决问题。
相关问题
用python.居民身份证是18位字符的编码,每个人的编码都是唯一的,校验规则如下: ∑(ai*wi)mod 11 = 1 i表示号码字符从左至右包括校验码字符在内的位置序号;ai表示第i位置上的号码字符值;Wi表示第i位置上的加权因子。即将各位上的数值乘上位权之和对11取余,余数为1则表示该编码正确。注意:如果最后一位校验码是“X”或“x”,则代表该校验码的数值为10。 各位的权值依次是:7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1 例如某身份证号码为:370683198901117657,这是正确的编码。 又如某号码为:470683198902117657,这是错误的编码。输入格式:第一行是一个数字n,表示后面有n行待判断的号码,从第二行起,每行一个18位的字符串,表示要判断的身份证号码.输出格式:输出一个数值,表示正确的身份证号码的个数
可以使用以下代码实现:
```python
n = int(input()) # 输入待判断的号码数量
weights = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1] # 各位的权值
count = 0 # 计数器,记录正确的身份证号码的个数
for i in range(n):
id_num = input() # 输入身份证号码
check_sum = 0 # 校验和
for j in range(17):
check_sum += int(id_num[j]) * weights[j] # 计算校验和
check_code = check_sum % 11 # 计算校验码
if check_code == 1:
if id_num[-1] == '1':
count += 1
elif check_code == 0:
if id_num[-1] == '0':
count += 1
elif check_code == 2:
if id_num[-1] == 'X' or id_num[-1] == 'x':
count += 1
else:
if str(12-check_code) == id_num[-1]:
count += 1
print(count) # 输出正确的身份证号码的个数
```
代码中用一个列表 `weights` 存储了各位的权值,然后遍历每个输入的身份证号码,计算校验和和校验码,再根据校验码判断身份证号码是否正确。最后输出正确的身份证号码的个数。
模拟一个公民身份证信息管理系统。通过读入文件数据,可以查询每个公民的身份证信息等。同时可以进行身份证校验,并将正确的信息保存至指定文件中。程序开始时,自动从文件读入信息到结构体数组,并提取每个公民的出生年月放入结构体中,同时进行身份证校验位是否正确,判断信息也放入结构体中。写一个实现 2 个日期比较大小的函数:其中参数birth1和birth2存放2个生日的结构体变量,如果 birth1晚于 birth2,函数返回正数, 如果 birth1等于 birth2,函数返回 0, 如果 birth1早于 birth2,函数返回负数。
好的,我会为您模拟一个公民身份证信息管理系统,并编写比较两个日期大小的函数。以下是代码实现:
```python
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 100
// 身份证信息结构体
typedef struct {
char name[MAX_LEN]; // 姓名
char id[MAX_LEN]; // 身份证号码
int year; // 出生年份
int month; // 出生月份
int day; // 出生日期
int sex; // 性别:0-女性,1-男性
int valid; // 是否有效:0-无效,1-有效
} IDInfo;
// 校验身份证号码是否合法
int checkID(char* id) {
int i, sum = 0, ai, wi;
char ch;
int weights[18] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1};
char codes[11] = "10X98765432";
for (i = 0; i < 17; i++) {
ch = id[i];
if (ch < '0' || ch > '9') {
return 0;
}
ai = ch - '0';
wi = weights[i];
sum += ai * wi;
}
int mod = sum % 11;
char code = codes[mod];
return (code == id[17]);
}
// 读取身份证信息并进行校验
void readIDInfo(IDInfo* pInfo, int n) {
FILE* fp = fopen("id_info.txt", "r");
if (!fp) {
printf("Failed to open file: id_info.txt\n");
exit(1);
}
int i;
for (i = 0; i < n; i++) {
fscanf(fp, "%s %s", pInfo[i].name, pInfo[i].id);
if (checkID(pInfo[i].id)) {
pInfo[i].valid = 1;
int year = (pInfo[i].id[6] - '0') * 1000 + (pInfo[i].id[7] - '0') * 100
+ (pInfo[i].id[8] - '0') * 10 + (pInfo[i].id[9] - '0');
int month = (pInfo[i].id[10] - '0') * 10 + (pInfo[i].id[11] - '0');
int day = (pInfo[i].id[12] - '0') * 10 + (pInfo[i].id[13] - '0');
pInfo[i].year = year;
pInfo[i].month = month;
pInfo[i].day = day;
pInfo[i].sex = (pInfo[i].id[16] - '0') % 2;
} else {
pInfo[i].valid = 0;
}
}
fclose(fp);
}
// 比较两个日期大小,如果 birth1 晚于 birth2,返回正数; 如果 birth1 等于 birth2,返回 0; 如果 birth1 早于 birth2,返回负数
int compareDate(IDInfo birth1, IDInfo birth2) {
if (birth1.year > birth2.year) {
return 1;
} else if (birth1.year == birth2.year) {
if (birth1.month > birth2.month) {
return 1;
} else if (birth1.month == birth2.month) {
if (birth1.day > birth2.day) {
return 1;
} else if (birth1.day == birth2.day) {
return 0;
} else {
return -1;
}
} else {
return -1;
}
} else {
return -1;
}
}
int main() {
int n = 2;
IDInfo* pInfo = (IDInfo*)malloc(n * sizeof(IDInfo));
if (!pInfo) {
printf("Memory allocation failed.\n");
exit(1);
}
readIDInfo(pInfo, n);
int cmp = compareDate(pInfo[0], pInfo[1]);
if (cmp > 0) {
printf("%s 的生日晚于 %s 的生日\n", pInfo[0].name, pInfo[1].name);
} else if (cmp == 0) {
printf("%s 和 %s 的生日相同\n", pInfo[0].name, pInfo[1].name);
} else {
printf("%s 的生日早于 %s 的生日\n", pInfo[0].name, pInfo[1].name);
}
free(pInfo);
return 0;
}
```
上面的代码实现了以下功能:
1. 定义了身份证信息结构体 `IDInfo`,其中包括姓名、身份证号码、出生年月、性别和是否有效等信息。
2. 定义了函数 `checkID`,用于校验身份证号码是否合法。校验算法采用的是国家标准 GB 11643-1999。
3. 定义了函数 `readIDInfo`,用于从文件中读取身份证信息并进行校验。校验通过的身份证信息将被保存在结构体数组 `pInfo` 中。
4. 定义了函数 `compareDate`,用于比较两个日期大小。该函数接受两个 `IDInfo` 类型的参数 `birth1` 和 `birth2`,如果 `birth1` 晚于 `birth2`,返回正数; 如果 `birth1` 等于 `birth2`,返回 0; 如果 `birth1` 早于 `birth2`,返回负数。
5. 在 `main` 函数中,读取两个公民的身份证信息,并比较两个生日的大小,输出结果。
注意:为了方便起见,身份证信息保存在名为 `id_info.txt` 的文本文件中,每行包括姓名和身份证号码两个字段,用空格分隔。本例中仅读取了两个公民的信息,您可以根据需要修改代码。
阅读全文
相关推荐















