首页 > 解决方案 > 身份证号码生成器

问题描述

所以基本上我得到了一个任务来创建一个生成器,它将为我的国家的公民生成有效的 ID 号。一个有效的数字是9位,对于每个数字,您需要根据索引将其乘以1或2,如果索引是偶数,则将num乘以1,否则将其乘以2。之后如果窗帘数字变得更大大于 9,将其更改为数字的总和。如果总和 % 10 == 0 则 num 有效。否则为假。

之后,他们希望我创建一个可以生成迭代器的类。在下一个方法中:如果给定的数字有效,则返回并乘以 2 并加 1,然后再次检查是否有效,如果不乘以 2 并加 2,依此类推。如果来自开头的 num 无效,乘以 2 并加 1,然后乘以 2 并加 2,依此类推...

import string
letters = string.ascii_letters
digits = string.digits


class NumNotNineLong(Exception):

    def __init__(self):
        pass
    def __str__(self):
        return "The number you provided is not nine digits long."

class NotNumber(Exception):

    def __init__(self):
        pass

    def __str__(self):
        return "The input you provided is not an integer"

class IDIterator():

    increment = 1

    def __init__(self,_id):
        self._id = _id  

    def __iter__(self):
       return self 

    def __next__(self):

        while check_id_valid(str(self._id)[-9::]) == False:
            self._id *= 2
            self._id += IDIterator.increment
            IDIterator.increment += 1
        if check_id_valid(str(self._id)[-9::]):
            result = str(self._id)[-9::]
            self._id *= 2
            self._id += 1
            IDIterator.increment = 2
            return result



def check_id_valid(id_number):
    for letter in str(id_number):
        if letter not in string.digits:
            raise NotNumber
    numbers = [int(i) for i in str(id_number)]
    if len(numbers) != 9:
        raise NumNotNineLong
    set_numbers = []
    for i in range(len(numbers)):
        if i % 2 == 0:
            set_numbers.append(numbers[i])
        else:
            set_numbers.append(numbers[i] * 2)
    true_numbers = []
    for num in set_numbers:
        if num > 9:
            temp = [int(i) for i in str(num)]
            true_numbers.append(sum(temp))
        else:
            true_numbers.append(num)
    if sum(true_numbers) % 10 == 0:
        return True
    else:
        return False


def main():
    result = IDIterator(123456780)
    for _ in range(10):
        print(result.__next__())




if __name__ == "__main__":
    main()

我的结果是:

209872373
274495985
097983944
391935780
903409134
227273083
545477432
363819467
910555747
409086964

想要的结果是:

209872373
863664504
569826803
339640302
473959864
544578024
356624288
466187762
040830960
487293938

救救我

谢谢你!

标签: pythonwindowsvisual-studio-codegenerator

解决方案


我对这个问题的看法:

class IDIterator:
    def __init__(self, num):
        self.__num = num

    def __iter__(self):
        n, num = 1, self.__num
        while True:
            num = int( str(num)[-9:] )
            if is_valid(num):
                yield '{:0>9}'.format(num)
                num *= 2
                num += n
                n = 1
            else:
                num *= 2
                num += n
                n += 1

def is_valid(num):
    s = '{:0>9}'.format(num)

    if len(s) != 9:
        return False

    nums = [int(ch) * 2 if i % 2 else int(ch) for i, ch in enumerate(s)]
    nums = [sum(int(c) for c in str(n)) for n in nums]
    return sum(nums) % 10 == 0

from itertools import islice

for num in islice(IDIterator(123456780), 0, 10):
    print(num)

印刷:

209872373
863664504
569826803
339640302
473959864
544578024
356624288
466187762
040830960
487293938

推荐阅读