序列是从自然数序列创建的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
在第二步中删除每个第二个数字:
1 3 5 7 9 11 13 15 17 19 21 23
删除第三步中的每个第三个数字(来自上一个序列):
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++; } }