シーケンスは、自然数のシーケンスから作成されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
2番目のステップで2番目ごとの数字を削除します:
1 3 5 7 9 11 13 15 17 19 21 23
(前のシーケンスから) 3番目のステップで3番目ごとの番号を削除します。
1 3 7 9 13 15 19 21
(前のシーケンスから) 4番目のステップで4番目ごとの番号を削除します。
1 3 7 13 19
など...これで、シーケンスの4番目の番号は13になると言えます。
これの定義と正しい解決策はここにあります:http://oeis.org/A000960
私の仕事は、シーケンスの1000番目のメンバーを見つけることです。このためのアルゴリズムを作成しましたが、かなり遅いと思います(10.000番目のメンバーで試してみると約13秒かかります)。それが何をするか:
number
偶数がないことがわかっているので、ステップごとに2ずつ増加します。counters
配列には、各ステップのインデックスを格納します。番号がx番目のステップのx番目である場合、それを削除する必要があります。たとえば、3番目のステップの番号5です。そして、次のステップのためにカウンターを開始します。ArrayList<Long> list = new ArrayList<Long>(10000); long[] counters = new long[1002]; long number = -1; int active_counter = 3; boolean removed; counters[active_counter] = 1; int total_numbers = 1; while (total_numbers <= 1000) { number += 2; removed = false; for (int i = 3; i <= active_counter; i++) { if ((counters[i] % i) == 0) { removed = true; if (i == active_counter) { active_counter++; counters[active_counter] = i; } counters[i]++; break; } counters[i]++; } if (!removed) { list.add(number); total_numbers++; } }