<返回更多

求N以内所有质数的算法及优化

2020-07-18    
加入收藏
求N以内所有质数的算法及优化

 

问题:输入一个正整数 N(N > 2),求小于 N 的全部质数。

质数,就是除了1和它本身外不存在其他因子的数。

1、基本循环法

循环法:利用质数的定义,循环判断该数除以比它小的每个自然数(大于1),如果有能被它整除的,则它就不是质数。

示例代码如下:

#include <IOStream>
using namespace std;

int main()
{
    int N = 50;
    int sumStep = 0; // 统计迭代次数
  
    cout << 2 << endl; // 2 是质数
    for (int i = 3; i < N; ++i) {
        bool flag = true; // 假设是质数
        for (int j = 2; j < i; ++j) {
            sumStep = sumStep + 1;
            if (!(i % j)) { // 找到能被整除的
                flag = false;
                break;
            }
        }
        if (flag) {
            cout << i << endl;
        }
    }
    cout << "sumStep: " << sumStep << endl;
  
    return 0;
}

运行结果如下:

求N以内所有质数的算法及优化

 

2、算法优化

可以看到,当 N = 50 时,上述算法总共进行了349次循环。

在上述基本算法的基础上,可以对循环进行一些优化,减少循环次数:

代码优化如下:

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    int N = 50;
    int sumStep = 0; // 统计迭代次数

    cout << 2 << endl; // 2 是质数
    for (int i = 3; i < N; i += 2) {
        bool flag = true;    // 假设是质数
        int jStop = sqrt(i); // 终止条件
        for (int j = 3; j <= jStop; j += 2) {
            sumStep = sumStep + 1;
            if (!(i % j)) { // 找到能被整除的
                flag = false;
                break;
            }
        }
        if (flag) {
            cout << i << endl;
        }
    }
    cout << "sumStep: " << sumStep << endl;

    return 0;
}

运行结果如下:

求N以内所有质数的算法及优化

 

优化后,只需31次循环,相比原来的349次,大大减少了循环次数,提升了算法效率。

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>