筛选法求质数表
问题
筛选法是一种古老的求不超过自然数 N(N>1)的所有质数的一种方法。具体做法是:先把 N 个自然数按次序排列起来。最小的质数是 2,所以先把 1 划去,从 2 开始,把 2 留下,而把 2 后面所有能被 2 整除的数都划去。然后 2 后面第一个没划去的数是 3,把 3 留下,再把 3 后面所有能被 3 整除的数都划去。3 后面第一个没划去的数是 5,把 5 留下,再把 5 后面所有能被 5 整除的数都划去。这样一直做下去,每次筛选之后,下一个相邻的数字都必然是质数,这样最后就会把不超过 N 的全部合数都筛掉,留下的就是不超过 N 的全部质数。
请在集算器中编写代码用这个算法找出 10000 以内的全部质数。
思路
大致思路:声明一个从 1 到 10000 的有序序列,把 1 划掉,从最小的质数 2 开始循环,将序列中能够被当前数整除的数赋值为 0,保留当前数本身,最后序列中不等于 0 的数即为 10000 以内的全部质数。
- 定义 1 到 10000 的递增序列。
- 将序列中值为 1 的成员赋值为 0。
- 对递增序列从 2 开始循环,循环体中将序列中能够被当前循环数整除的数赋值为 0。
- 剩下的不为 0 的数就是质数。
代码
A | B | C | ||
---|---|---|---|---|
1 | 10000 | |||
2 | =to(A1) | 生成从 1 到 10000 的序列 | ||
3 | >A2(1)=0 | 将值为 1 的成员赋值为 0 | ||
4 | for A2 | if A4>0 | 循环 A2 序列,如当前数不为 0,则说明是质数,把其后能被该数整除的数都置为 0 | |
5 | =A1.step(A4,A4).to(2,) | |||
6 | >A2(C5)=0 | |||
7 | =A2.select(~>0) | 最后剩下的不为 0 的数就是质数 |
英文版
大佬,这个方法有没有测试 1e7 之内的质数,没有剪枝,效率一般。
我也模仿了一个,但效率不稳定,有时快,有时慢,还有没有更快的写法?