对于求1~n以内的素数问题,可有两种思路,一是枚举1到根号n,如果存在数i的一个因子,则判断非素数。另一种思路是使用埃式筛法,枚举2到n,从2而开始,由2是最小的素数,故依次筛去2的倍数,然后继续筛去下个素数的倍数,下个素数为上一步没被筛去的最小数。直到到达边界n时停止。
一、枚举法
#include <iostream>
#include <cmath>
using namespace std;
const int MAX = 101;//求1~MAX-1内所有素数
int prime[MAX];//存放所有素数
bool flag[MAX] = {0};//标记数组,当前数i是否为素数
int count = 0; //统计素数的个数
bool isPrime(int n) {//判断当前数是否为素数
if (n <= 1) return false;
for (int i = 2; i <= sqrt(n); ++i) {//从2开始,依次枚举
if (n % i == 0)
return false;
}
return true;
}
void FindPrime() {//求所有素数,并将其保存到prime数组当中
for (int i = 1; i < MAX; ++i) {
if (isPrime(i)) {
prime[count++] = i;
flag[i] = true;
}
}
}
int main() {
FindPrime();
for (int i = 0; i < count; ++i) {
cout << prime[i] << " ";
}
return 0;
}
二、埃式筛法
#include <iostream>
#include <cmath>
using namespace std;
const int MAX = 101;//求1~MAX-1内所有素数
int prime[MAX];//存放所有素数
bool EratFlag[MAX] = {0};//埃式筛法,标记当前数i是否被筛去
int count = 0; //统计素数的个数
void Eratosthenes() {//埃式筛法
for (int i = 2; i < MAX; ++i) {
if (EratFlag[i] == 0) {//如果未被筛去,即为素数
prime[count++] = i;
for (int j = i + i; j < MAX; j += i) {//倍数增加,筛去数i在所给范围内所有倍数
EratFlag[j] = true;//标记数组置1
}
}
}
}
int main() {
Eratosthenes();
for (int i = 0; i < count; ++i) {
cout << prime[i] << " ";
}
return 0;
}
应用
https://blog.csdn.net/qq_43643944/article/details/116332591
https://blog.csdn.net/qq_43643944/article/details/116398502