[伯俊]#4673-セルフサービス番号(Python,Python)


自動番号付け


https://www.acmicpc.net/problem/4673

私が書いたコード


次のdを求める場合、ジェネレータを文字列に変換し、各ビット数を数字に再変換する方法で、各ビット数の和を比較的容易に求めることができるが、性能面では残数と除算を用いるほうがよい.
self_nums = [True] * 10001
for i in range(1, 10001):
    if not self_nums[i]:
        continue

    print(i)

    now = i
    while True:
        next = now
        while now > 0:
            next += now % 10
            now //= 10

        if next > 10000:
            break

        self_nums[next] = False
        now = next

集合データ型のコードの使用


これは上記のコードで正解を得てネット検索で見つける方法です.
集合資料型を使用すると、資料の重複を簡単にフィルタできます.
このようにremove setに資料を入れると、繰り返して消えてしまい、後で全体から外すと、自分の番号が簡単に手に入ります.
この方法は私が思ったより速いです.
remove_set = set()
for i in range(1, 10001):
    d = i
    while i > 0:
        d += i % 10
        i //= 10

    remove_set.add(d)

self_nums = sorted(set(range(1, 10001)) - remove_set)
print(*self_nums, sep="\n")