题目:
1 一、二选一 2 1、每个区生成1个符合身份证规则的身份证号码 3 2、随机生成10个符合身份证规则的身份证号码 4 二、要求: 5 1、身份证属于南京市 6 2、出生日期为1980-1-1 至 2019-8-1的人 7 三、扫盲: 8 320100 南京市 9 320102 玄武区 10 320104 秦淮区 11 320105 建邺区 12 320106 鼓楼区 13 320111 浦口区 14 320113 栖霞区 15 320114 雨花台区 16 320115 江宁区 17 320116 六合区 18 320117 溧水区 19 320118 高淳区 20 1、前1、2位数字表示江苏省的代码; 21 2、第3、4位数字表示南京市的代码; 22 3、第5、6位数字表示所在区(县、自治县、县级市)的代码; 23 4、第7—14位数字表示出生年、月、日; 24 5、第15、16位数字表示所在地的派出所的代码; 25 6、第17位数字表示性别(奇数表示男性,偶数表示女性); 26 7、第18位数字是校检码:校检码可以是0—9的数字,可以以是x。X是罗马数字的10 27 四、重点说明: 28 第18位的计算: 29 1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。 30 2、将这17位数字和系数相乘的结果相加。 31 3、用加出来和除以11,看余数是多少? 32 4、余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。(即余数0对应1,余数1对应0,余数2对应X...)
小余的答案:
1 #!/opt/python27/bin/python 2 # -*- coding:utf-8 -*- 3 # author:why 4 5 import random 6 ''' 7 一、题目: 8 二选一 9 1、每个区生成1个符合身份证规则的身份证号码 10 2、随机生成10个符合身份证规则的身份证号码 11 二、要求: 12 1、身份证属于南京市 13 2、出生日期为1980-1-1 至 2019-8-1的人 14 三、扫盲: 15 320100 南京市 320102 玄武区 320104 秦淮区 320105 建邺区 320106 鼓楼区 320111 浦口区 320113 栖霞区 320114 雨花台区 320115 江宁区 320116 六合区 320117 溧水区 320118 高淳区 16 1、前1、2位数字表示江苏省的代码; 17 2、第3、4位数字表示南京市的代码; 18 3、第5、6位数字表示所在区(县、自治县、县级市)的代码; 19 4、第7—14位数字表示出生年、月、日; 20 5、第15、16位数字表示所在地的派出所的代码; 21 6、第17位数字表示性别(奇数表示男性,偶数表示女性); 22 7、第18位数字是校检码:校检码可以是0—9的数字,可以以是x。X是罗马数字的10 23 四、重点说明: 24 第18位的计算: 25 1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。 26 2、将这17位数字和系数相乘的结果相加。 27 3、用加出来和除以11,看余数是多少? 28 4、余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。(即余数0对应1,余数1对应0,余数2对应X...) 29 ''' 30 31 class idGener: 32 def __init__(self): 33 id16 = ['320100','320102','320104','320105','320106','320111','320113','320114','320115','320116','320117','320118'] 34 moduId = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2] #第一位到第十七位的系数 35 id18Rema ={'0':'1','1':'0','2':'X','3':'9','4':'8','5':'7','6':'6','7':'5','8':'4','9':'3','10':'2'} 36 self.id16 = id16 37 self.moduId = moduId 38 self.id18Rema = id18Rema 39 40 def id16Gener(self,id): 41 ''' 42 取值,1-6位 43 :param id: 1-12 时取 固定值,其他取随机 44 :return: str 320102 45 ''' 46 if id <= len(self.id16) and id > 0: 47 resId16 = self.id16[id-1] 48 else: 49 resId16 =random.sample(self.id16,1) 50 resId16 = resId16[0] 51 return resId16 52 53 def id714Gener(self): 54 ''' 55 取值,7-14位 56 :return: 57 ''' 58 id710 = random.sample(range(1980,2020),1)[0] 59 id1112 = random.sample(range(01,13),1)[0] 60 if id1112 == 02:# 判断闰月 61 if id710%4 == 0 and id710%100 != 0 : 62 id1314 = random.sample(range(01,29),1)[0] 63 else: 64 id1314 = random.sample(range(01, 30), 1)[0] 65 elif id1112 in (1,3,5,7,8,10,12):#31天 66 id1314 = random.sample(range(01,32),1)[0] 67 else: 68 id1314 = random.sample(range(01, 31),1)[0] 69 if id1112 < 10: 70 id1112Str = '0'+str(id1112) 71 else: 72 id1112Str = str(id1112) 73 if id1314 <10: 74 id1314Str = '0'+str(id1314) 75 else: 76 id1314Str = str(id1314) 77 return str(id710)+id1112Str+id1314Str 78 79 def id1517Gener(self): 80 ''' 81 随机生成0-9 82 :return: str 83 ''' 84 id710 = random.sample(range(0, 10), 1)[0] 85 return str(id710) 86 87 def id18Gener(self): 88 ''' 89 1.求和取余 90 2.判断第18位 91 :return: 返回18位身份证 92 ''' 93 id117Str = self.id16Gener(111)+self.id714Gener()+self.id1517Gener()+self.id1517Gener()+self.id1517Gener() 94 id117List = list(map(int, id117Str)) #转list 95 moduSumTol = 0 96 for i in range(0,len(id117List)): 97 moduSum = id117List[i] * self.moduId[i] 98 moduSumTol += moduSum 99 remainId = moduSumTol % 11 100 id18Str = self.id18Rema[str(remainId)] 101 id118Str = id117Str + id18Str 102 print id118Str 103 104 if __name__ == '__main__': 105 id = idGener() 106 id.id18Gener()
小敏的答案:
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @File : IdCard.py 4 # @Author: min 5 # @Date : 2019/9/5 6 7 8 ''' 9 一、题目: 10 11 二选一 12 1、每个区生成1个符合身份证规则的身份证号码 13 2、随机生成10个符合身份证规则的身份证号码 14 15 二、要求: 16 17 1、身份证属于南京市 18 2、出生日期为1980-1-1 至 2019-8-1的人 19 20 三、扫盲: 21 22 1、前1、2位数字表示江苏省的代码; 23 2、第3、4位数字表示南京市的代码; 24 3、第5、6位数字表示所在区(县、自治县、县级市)的代码; 25 4、第7—14位数字表示出生年、月、日; 26 5、第15、16位数字表示所在地的派出所的代码; 27 6、第17位数字表示性别(奇数表示男性,偶数表示女性); 28 7、第18位数字是校检码:校检码可以是0—9的数字,可以以是x。X是罗马数字的10 29 30 四、重点说明: 31 32 第18位的计算: 33 1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。 34 2、将这17位数字和系数相乘的结果相加。 35 3、用加出来和除以11,看余数是多少? 36 4、余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。(即余数0对应1,余数1对应0,余数2对应X...) 37 ''' 38 import random 39 40 41 def creatIdCard(): 42 citylist = [320100, 320102, 320104, 320105, 320106, 320111, 320113, 320114, 320115, 320116, 320117, 320118] 43 city = random.choice (citylist) 44 year = random.randint (1980, 2019) 45 month = random.randint (1, 12) 46 if month in (1, 3, 5, 7, 8, 10, 12): 47 day = 31 48 elif month in (4, 6, 9, 11): 49 day = 30 50 elif month == 2: 51 if year % 400 == 0: 52 day = 29 53 else: 54 day = 28 55 police = random.randint (10, 99) 56 sex = random.randint (1, 9) 57 seventeen_str = str (city) + str (year) + str (month) + str (day) + str (police) + str (sex) 58 seventeen_list = list (map (int, seventeen_str)) 59 stlist = [] 60 num = 0 61 for i in range (16): 62 stlist.append (seventeen_list[i]) 63 secret = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] 64 65 for i in range (16): 66 num += stlist[i] * secret[i] 67 remainder = num % 11 68 eigthteen = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2] 69 70 result = str (city) + str (year) + str (month) + str (day) + str (police) + str (sex) + str (eigthteen[remainder]) 71 print result 72 73 if __name__ == '__main__': 74 creatIdCard ()
四爷的答案:
1 # encoding: utf-8 2 3 import time 4 import random 5 6 ary = [] 7 ary1 = [] 8 def regiun(): 9 #生成身份证前六位 10 #列表里面的都是一些地区的前六位号码 11 first_list = ['320100','320102','320104','320105','320106','320111','320113','320114','320115','320116','320117','320118'] 12 13 a1=(1980,1,1,0,0,0,0,0,0) #设置开始日期时间元组(1980-01-01 00:00:00) 14 a2=(2019,8,01,23,59,59,0,0,0) #设置结束日期时间元组(2019-08-01 23:59:59) 15 start=time.mktime(a1) #生成开始时间戳 16 end=time.mktime(a2) #生成结束时间戳 17 18 #随机生成日期字符串 19 for i in range(10): 20 str1 = "" 21 for j in range(3): #生成三位随机数字 22 ch = chr(random.randrange(ord('0'), ord('9') + 1)) 23 str1 += ch 24 first = random.choice(first_list) #前六位,随机取一个 25 t=random.randint(start,end) #在开始和结束时间戳中随机取出一个 26 date_touple=time.localtime(t) #将时间戳生成时间元组 27 date=time.strftime("%Y%m%d",date_touple) #将时间元组转成格式化字符串(19760521) 28 ary.append(first + date+ str1) 29 #print ary 30 31 for k in range(0, len(ary)): 32 count = 0 33 weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] # 权重项 34 checkcode = {'0':'1','1':'0','2':'X','3':'9','4':'8','5':'7','6':'6','7':'5','8':'4','9':'3','10':'2'} # 校验码对应的最后一位 35 ary2 = ary[k] 36 for m in range(0,len(ary2)): 37 38 count = count + int(ary2[m]) * weight[m] 39 id = checkcode[str(count%11)] # 算出最后一位校验码 40 ary[k] = ary[k] + id 41 # print ary 42 return ary 43 44 print regiun()