C++程序 寻找给定区间内的质数
给定两个数字a和b作为区间范围,任务是在这个区间内找出所有的质数。
例子:
输入: a = 1,b = 10
输出: 2,3,5,7
输入: a = 10,b = 20
输出: 11,13,17,19
在下面的程序中,区间数字作为输入存储在变量’a’和’b’中。然后使用for循环遍历a和b之间的数字。对于for循环中的每个数字,都会检查该数字是否为质数。如果是质数,则打印该数字。然后继续检查循环中的下一个数字,直到所有数字都被检查完成。
程序:
输出:
时间复杂度: O((b-a)*(b/2)),其中a和b是下限和上限。
辅助空间: O(1)
优化解决方案:
思路是使用偶数(除2外)不是质数。
输出:
时间复杂度: O((b-a)*(sqrt(b))).
辅助空间: O(1).
厄拉多塞筛法:
当 N 小于 1000 万左右时,厄拉多塞筛法是寻找小于 N 的所有素数最有效的方法之一。
步骤:
- 建立一个名为 prime[srt 到 n] 的布尔数组,并将数组的所有项初始化为 true。
- 将 prime[0] 和 prime[1] 标记为 false,因为它们不是素数。
- 从 p= sqrt 开始,对于小于等于 n 的每个素数 p,将所有大于等于 p*p 的 p 的倍数标记为合数,将 prime[i] 设置为 false。
- 最后,输出 sqrt 到 n 之间的所有素数。
以下是实现方式:
输出
复杂性分析:
时间复杂性:
筛法求素数算法的时间复杂度是 O(n*log(log(n))) ,因为它遍历了从2到n的所有数并移除每个质数的所有倍数。
在此代码中,该算法仅应用于[srt,n]的范围,将时间复杂度降低到O((n-srt+1)*log(log(n)))
,对于范围[srt,n]。标记每个质数的倍数的循环从p * p到n,需要O((n-srt+1)*log(log(n)))
的时间。因此,该代码的总时间复杂性为O((n-srt+1)*log(log(n)))
.
辅助空间:
该算法的空间复杂度为 O(n) ,这是布尔数组prime的大小。但是,数组的大小减小到n+2-srt,这是范围[srt,n]所需的数组大小。因此,该代码的辅助空间复杂度为O(n-srt+1)。