身份证号批量升位
类型:列表元组
描述
我国自1999年10月1日身份证号码由15位改成18位,1999年以前出生的人持有的旧身份证号码均为15位,1999年10月1日以后出生的人获得的身份证号都是18位。
读取附件中文本文件id15.txt,用户输入一个正整数 n (n<=30),将其中的前 n 行中的15位身份证号升到18位并输出,身份证号升位规则如下:
第一步,在原十五位数身份证的第六位数后面插入19 (1905年1月1日以后出生),这样身份证号码即为十七位数;
第二步,按照国家规定的统一公式计算出第十八位数,作为校验码放在第二代身份证的尾号。
校验码计算方法:将身份证前十七位数分别乘以不同系数并求和:
S = Sum(Ai * Wi)
其中:
Ai:表示第i位置上的身份证号码数字值, i = 0, ... , 16
Wi:表示第i位置上的加权因子,Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
S对11取模得到余数0-10,对应的校验码如下:
余数 Y: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2
# 题目假设所有人均出生于1905年1月1日以后,1999年10月1日以前。
# 下载附件中的文件,与本地创建的文件放在同一文件夹下测试使用,读取文件可以参考以下语句:
n = int(input()) # 读入一个正整数
with open('id15.txt','r',encoding='utf-8') as file: # 打开文件,创建文件对象
for i in range(n): # 循环读取 n 行
line = file.readline() # 每次读取文件中的一行,line为一个字符串
# 本题输出时,身份证与姓名数据间的间隔为中文全角空格,可以复制使用以下的sep参数。
sep=' '
输入格式
输入一个正整数 n (n<=30)
输出格式
n行18位的身份证号及姓名(保持与原文件格式一致)
示例
输入:
3
输出:
420303197909085436 陆强映
451423199101187591 何梓咏
35052419860924609X 杨卫禾
参考代码
def id15218(id15):
ls = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
ecc = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
sum = 0
j = 0
if int(id15[6:8]) >= 5:
id17 = id15[0:6] + '19' + id15[6:]
else:
id17 = id15[0:6] + '20' + id15[6:]
for i in id17:
sum = sum + int(i) * ls[j]
j = j + 1
id18 = id17 + ecc[sum % 11]
return id18
n = int(input())
with open('id15.txt','r',encoding='utf-8') as file:
for i in range(n):
line = file.readline()
line = line.replace(line[0:15],id15218(line[0:15]))
print(line.strip())
# ls.append(line)
# with open('id18.txt','w',encoding='utf-8') as file:
# file.writelines(ls)
# with open('id18.txt','w',encoding='utf-8') as file:
# file.writelines(ls)