[Swift]バックアップアルゴリズム#4673


📝 質問する


セルフサービス番号は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以下のセルフ・サービス番号を出力するプログラムを作成します.

入力


入力していません.

🖨 しゅつりょく


10000以下の自己符号を行ごとに1つ追加する順序で出力します.

🖨 サンプル出力

1
3
5
7
9
20
31
42
53
64
 |
 |       <-- a lot more numbers
 |
9903
9914
9925
9927
9938
9949
9960
9971
9982
9993

📚 私が提出したコード

func d(_ n : Int) -> Int {
    let nArr = String(n).map { Int(String($0))! }
    var sum = n
    for i in nArr {
        sum += i
    }
    return sum
}
var array = [Int]()
var notSelf = [Int]()
for i in 1 ... 10000 {
    array.append(i)
    let sum = d(i)
    if sum <= 10000 {
        notSelf.append(sum)
    }
}

let difference = array.filter { !notSelf.contains($0) }
for d in difference {
    print(d)
}

▼▼私が提出したコードの説明

  • array.filter{notSelf.contains($0)}:配列要素はnotSelfに含まれない要素のみを返します.
  • メモリ:62512 KB
  • 時間:52 ms
  • コード長:408 B
  • 👀 さらに理解する必要がある

  • array.filter{notSelf.contains($0)}の動作原理