挑战
实施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。