[アルゴリズム]白駿4673号自作号(Python)


白駿#4344


問題のショートカット

質問する


:セルフサービス番号は1949年にインドの数学者D.R.Kaprekarによって命名された.正の整数nについて、d(n)がnおよびnの各ビット数の関数を定義する.例えば、d(75)=75+7+5=87である.
正の整数nが与えられると、その数からn、d(n)、d(d(n)、d(d(d(n))、...無限数列を生成できます.
たとえば、33で始まると、次の数字は33+3+3=39、次の数字は39+3+9=51、次の数字は51+5+1=57となります.このようにして、次の数の列を生成できます.
33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...
nをd(n)の生成者と呼ぶ.上の数列において、33は39の生成者、39は51の生成者、51は57の生成者である.生成者が1つより多い場合もあります.例えば、101には2つの構造関数(91および100)がある.
生成されていない数字を自動番号と呼びます.100未満のセルフサービス番号は全部で13個です.1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97
10000以下のセルフ・サービス番号を出力するプログラムを作成します.

I/Oルール


1.入力
  • 入力なし
    2.出力
  • 万以下の自作番号で行ごとに増加する順序で出力される.
  • 質問へのアクセス


    これは
  • 1から10000までの数字のうち、生成者の数字がある以外は、自分の番号を出力する問題です.数値範囲から生成者が存在する数値を減算するように解く.
  • 集合資料型set()関数を用いて,生成者が存在する数字を空集合に追加することによりaddメソッドを用いた.
  • 数字のビット数を分離するためにstrを用いてビット数を分離した.
  • set関数の集合資料型については,重複要素を加えることができない性質のほかに順序がないという特徴がある.順序を出力する必要があるため、ソート関数を使用してソートします.
  • 問題解決(Python)

    total_number = set(range(1, 10001))
    target_number = set()
    
    for i in range(1, 10001):
      for j in str(i):
        i += int(j)
      target_number.add(i)
    
    self_number = sorted(total_number - target_number)
    
    for k in self_number:
      print(k)
    

    かいがく

  • set関数の使い方を理解しました.
  • その結果,
  • strで座席数をそれぞれ分離した.