Pythonの白駿4673セルフナンバーを使用


開けてみます。


これは1から10001の間の自己番号を求める問題です.
  • Self Numberとは?
    n+nの各ビット数の合計が返されることを示すd(n)という関数があり、d(n)に入力された値は出力として使用できません.すなわち、構造関数がなく、つまり値は値です.
  • 最初の構想と問題に直面する


    まず,以下に示す2つのユーザ関数を定義して解放する方法を考える.

  • function 1:問題で提案したd(n)に従ってリストの関数を保存する

  • function 2:自然数1から10001までの値からd(n)の出力リストの要素以外の結果リストを求め,これらのリスト要素の関数を順次出力する.
  • 以下に、上記の関数を実現した後に現れる第1セグメントコードの一部を示す.

    そしてこのように実現し、2つの問題に直面した.

  • 問題1:function 1のd(n)関数を実現し,想像以上に非効率で汚いと感じた.もっと良いshort-cutができると思いますが、いずれにしてもfunction 1は実現し、動作は正常です.

  • 質問2:重要な問題に遭遇しました.これは2つのlist間の重複要素をどのように排除するかに対する悩みである.最後に降伏を宣言して、方法を探して、少し虚脱な感じがします.
    知ることが力であるという教訓を改めて銘記する.

  • 問題2の解決方法は簡単です.
    これはリストではなくset資料型を比較する問題です.
    私はずっとこの点を体現したいと思っています.
    Nested Loopを使用すると,10001 x 10001の低効率比較を経たため効率が低下し,これを実現することも容易ではない.
    そして最終的に降伏を宣言しfunction 2に代わる方法を見つけ,set間の演算を用いて直接関数を実現する必要がない問題を簡単に解決できることが分かった.
    (もちろんリストできるかどうかはわかりませんが、徐々に分かる問題です)
  • set 1-set 2を実施した後、set 1からset 2に存在する同一要素を集合間減算で除去し、function 2の代わりに集合を返す非常に簡単な方法で置き換えた.

    最終コード


    function 1もより効率的なshort-cutを参照して修正した.
  • の従来の方法では、strを使用してlistをstrとして保存し、現在のコードではstrを使用してlistの文字リストをlevel-2 loopの重複リストとして生成する.
  • また、不要な関数定義は使用しません.
    
    naturalNum = set(range(1,10001))
    compareNum = set()
    
    #function1에 해당하는 부분
    for i in range(1,10001):
      sum = 0
      for j in str(i) :
        sum += int(j)
      sum += int(i)
      
      compareNum.add(sum)
      
    #function2에 해당하는 부분
    selfNum = sorted(naturalNum - compareNum)
    
    for i in selfNum :
      print(i) 
    ref
    https://wook-2124.tistory.com/252