挑战
实施Sundaram筛子查找下面的质数n。取一个输入整数,n并输出下面的质数n。您可以假设该值n始终小于或等于一百万。
筛
从从
1到的整数列表开始n。删除以下形式的所有数字
i + j + 2ij:i并且j小于n。j始终大于或等于i,大于或等于1。
i + j + 2ij小于或等于n
将剩余数字乘以
2,然后加1。
这将产生2小于的所有质数(除了应包含在输出中的质数)2n + 2。
这是用来在下面找到素数的筛子的动画202。

输出量
您的输出应该是每个素数≤ n(按升序排列),后跟换行符:
2
3
5
哪里n是5。
例子
> 10
2
3
5
7
> 30
2
3
5
7
11
13
17
19
23
29
输入用表示>。
要求使用特定方法的挑战的麻烦在于,尚不清楚人们可以进行哪些修改。例如,您的描述仅
—
xnor 2015年
(i,j)使用进行检查i<=j,但是如果我们忽略此要求,结果不会改变。我们可以这样做来节省字节吗?
我从没说过你必须检查一下
—
扎克·盖茨
i <= j。这只是筛子工作方式的一部分。所以是的,您可以i <= j在代码中省去。@xnor
我们这里有多少余地?筛子等效于选择所有非奇数(因为结果为形式
—
马丁·恩德
2n+1),而不是形式2(i + j + 2ij)+1-我们可以直接在潜在质数上测试此属性,还是我们的代码必须在某点做2加1的时间? ?
n整个事情让我有些困惑。在方法说明中,它说它将生成直到的所有素数2 * n + 2。但是在输入/输出描述中,它说输入为n,而输出全为n。因此,我们是否应该应用该方法来生成直至的所有素数2 * n + 2,然后删除大于n输出的素数?还是应该n从输入中计算方法描述中的n?
n=30在输出中缺少29。