【发布时间】:2012-05-11 12:33:17
【问题描述】:
在自然数系列中,我们必须在第一遍中删除每个第二个元素。然后在剩余的元素中,删除第二遍中的每个第 3 个元素。然后在第 K 次通过时,从剩余元素中删除每个第 (k+1) 个元素。
这个系列会这样发展
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, ...
在第 1 遍之后(在删除每个第 2 个元素之后),
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, ...
在第二遍之后,(在删除每个第三个元素之后),
1, 3, 7, 9, 13, 15, 19, 21, 25, 27, ...
第三遍之后,(每删除第四个元素之后),
1, 3, 13, 15, 19, 25, 27, ...
所以,在无穷大通过之后,就会变成
1, 3, 7, 13, 19, 27, 39, 49, 63, 79, ...
这个系列也被称为 Flavius-Josephus 筛子。
解决方案,找到系列中的第 6 个元素:
- 做 6^2 = 36
- 下降到 5 的倍数得到 35
- 然后下降到 4 = 32 的倍数
- 然后下降到 3 的倍数 = 30
- 然后下降到 2 = 28 的倍数
- 然后下降到 1 = 27 的倍数
- 所以第六个幸运数字是 27。
虽然可行,但我不明白解决方案的工作原理?
这是一个 C 程序,
int calc(int n)
{
if (n == 1) return 1;
return calc_rec(n*n, n-1);
}
int calc_rec(int nu, int level)
{
int tmp;
if (level == 1) return (nu-1);
tmp = nu % level;
return calc_rec(nu - (tmp ? tmp : level), level-1);
}
解释这个http://oeis.org/A000960的链接
【问题讨论】:
-
在math.stackexchange.com问这个问题你可能会受益
标签: algorithm math sieve number-sequence