ここではすでに折りたたみ数を定義しています。
しかし、これからスーパーフォールディングナンバーを定義します。スーパーフォールディング数は、十分に折り畳まれると、最終的には2の累乗よりも1少ない数になります。フォールディングの方法は、フォールディング数の質問とは少し異なります。
フォールディングアルゴリズムは次のようになります。
バイナリ表現を取る
例:5882
1011011111010
3つのパーティションにそれをこぼした。前半、後半、中桁(奇数桁の場合)
101101 1 111010
中央の数字がゼロの場合、この数値は折りたたむことができません
後半を逆にして前半に重ね合わせる
010111 101101
桁を追加します
111212
- 結果に2がある場合、数値は折りたたむことができません。それ以外の場合、新しい数値は折りたたみアルゴリズムの結果です。
連続した1つの文字列に折りたたむことができる場合、その番号はスーパーフォールディング番号です。(すべての折りたたみ番号もスーパー折りたたみ番号です)
あなたの仕事は、数値を取り込んで、その数値がスーパーフォールディング数であれば真の値を出力し、そうでなければ偽のコードを書くことです。プログラムの規模で採点されます。
例
5200
バイナリに変換:
1010001010000
半分に分割:
101000 1 010000
真ん中は1つなので、続けて半分を重ね合わせます。
000010
101000
それらを追加しました:
101010
2はないので、半分に分割し続けます。
101 010
折りたたみ:
010
101
111
結果は111
(10進数で7)なので、これはスーパーフォールディング番号です。
テストケース
最初の100個のスーパーフォールディング番号は次のとおりです。
[1, 2, 3, 6, 7, 8, 10, 12, 15, 20, 22, 28, 31, 34, 38, 42, 48, 52, 56, 63, 74, 78, 90, 104, 108, 120, 127, 128, 130, 132, 142, 150, 160, 170, 178, 192, 204, 212, 232, 240, 255, 272, 274, 276, 286, 310, 336, 346, 370, 400, 412, 436, 472, 496, 511, 516, 518, 524, 542, 558, 580, 598, 614, 640, 642, 648, 666, 682, 704, 722, 738, 772, 796, 812, 852, 868, 896, 920, 936, 976, 992, 1023, 1060, 1062, 1068, 1086, 1134, 1188, 1206, 1254, 1312, 1314, 1320, 1338, 1386, 1440, 1458, 1506, 1572, 1596]
3
再びテストケースに忍び込んだのですか?分割して1 1
すぐにを与えるので、どのように折りたたむことができるかわかりません2
。それとも、それをゼロ回折りたたむことも数えると言っていますか?