埃氏筛法的思想
判断当前位置的数是否为素数,如果是,则以该数为因子的所有数均标记为合数(筛除掉 ),判断到√n的位置即可,n为数组总长度。最终剩下的未筛除的数即为素数。
#include<iostream>
#include<stdio.h>
#include<math.h>//sqrt()函数所在头文件
using namespace std;
#define N 24
int main() {
int flag[N+1] = {0};//标记数组,表示是否剔除
int m = 0, n = 0, gcd = 1;
int i, j, k, up = 0;
up = sqrt(N) + 1; //根号N向上取整的一种实现
cout<<"input m and n,divided by spacebar:"<<endl;
cin>>m>>n;
for (i = 2; i <= up && flag[i] == 0; i++) {
j = i + i;
while (j <= N) {
if (j % i == 0 && flag[j] == 0)
flag[j] = 1;
j = j + i;
}
}
//printf("the prime numbers in 2~24:\n");
for (k = 2; k <= N && flag[k] == 0;k++ ) {
while (m % k == 0 && n % k == 0 && n != 1) {
gcd *= k;
cout << k << endl;
m = m / k;
n = n / k;
}
}
cout<<"gcd="<<gcd<<endl;
return 0;
}
参考博客:
素数筛法详解(欧拉筛&埃氏筛)
埃氏筛法和欧拉筛法的区别