问题:输入一个正整数 N(N > 2),求小于 N 的全部质数。
质数,就是除了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 = 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;
}
运行结果如下:
优化后,只需31次循环,相比原来的349次,大大减少了循环次数,提升了算法效率。