身份证扩展(类构造与析构)Python

2023-07-30 10:39:26 浏览数 (1)

题目描述

定义一个身份证类,将 15 位的旧版身份证号扩充为 18 位。

在 15 位身份证号中,第 7、8 两位为出生年份,例如,1980 年出生的人,身份证号码的第 7、8 位的值是 80,在 18 位身份证号中,将 7~10 四位的值改为 1980,并将原身份证号码第 9 位开始以后的所有数字依次向右平移 2 位。在 18 位身份证号中, 最后增加一位校验码,校验码的计算方法如下(只考虑 20 世纪出生的公民):

(1)将已扩展出的 17 位身份证号按各位上的数字进行加权求和,结果为 S。自左到右各位上的数字的权值依次为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}。

(2)将 S 对 11 取余运算,结果为 Y。

(3)根据 Y 的取值大小顺序{0,1,2,3,4,5,6,7,8,9,10}取对应的校验码{1,0,X,9,8,7,6,5,4,3,2}。

例如,当 15 位身份证号为 340524800101001 时,扩展年份后成 17 位:34052419800101001,各位上的数字的加权和 S=3*7 4*9 0*10 5*5 2*8 4*4 1*2 9*1 8*6 0*3 0*7 1*9 0*10 1*5 0*8 0*4 1*2=189,S对11取余,即 S=189=2,则校验码为“X”。

要求类定义中包含完整的含参构造函数,默认构造函数,以及析构函数。

输入

测试组数t

以下t行,输入15位身份证号

输出

每个实例包含三行输出

第1行,在构造函数输出原身份证号,看样例

第2行,调用类方法输出扩展后的身份证号,看样例

第3行,在析构函数输出提示信息,包含扩展后身份号末4位,看样例

输入样例1

2 340524800101001 310001000101452

输出样例1

construct ID=340524800101001 upgrade ID=34052419800101001X destruct ID=001X construct ID=310001000101452 upgrade ID=310001190001014527 destruct ID=4527

思路分析

在把C 的程序转为Python的时候遇到了许多问题。

一是字符串改变问题,python中字符串是不能修改的,所以需要插入操作的时候就需要把字符串变成列表插入。

二是权重问题,我之前写C 的时候是用的直接一个乘一个加起来写一个很长的行,很费劲,也容易写错,这次想到了用一个整数列表作为权重,用循环的方法解决,我真是聪明^_^

三是我的字符串已经变成列表了,所以打印出来的时候还是以列表的方式,所以我得把列表变回字符串。

噢,整个过程用了切片的方法,python的切片确实好用。

AC代码

代码语言:javascript复制
class ID:
    def __init__(self,id):
        self.__passid=id
        print('construct ID=%s'%(self.__passid))
    def __del__(self):
        print('destruct ID=%s'%(self.__nowid[14:18]))
    def update(self):
        self.__nowid=self.__passid
        self.__nowid=list(self.__nowid)
        self.__nowid[6:6]='19'
        power=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
        codekey=0
        for i in range(0,17):
            codekey=codekey power[i]*int(self.__nowid[i])
        codekey=codekey
        codelist='10X98765432'
        self.__nowid[17:17]=codelist[codekey]
        self.__nowid="".join(self.__nowid)
        print('upgrade ID=%s'%(self.__nowid))
test=int(input())
for i in range(0,test):
    id=input()
    person=ID(id)
    person.update()

0 人点赞