> 文档中心 > 欧拉筛(最小质因数)

欧拉筛(最小质因数)


例如(打表)求0~1000以内的素数:

#includeusing namespace std;bool vis[1000];int p[1000];int idx=0;int main(){for(int i=2;i<1e3;i++){if(!vis[i]){p[idx++]=i;for(int j=i*i;j<1e3;j+=i)vis[j]=1;}}for(int i=0;i<idx;i++)cout<<p[i]<<",";    return 0;}

结果: 

2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997,

如果求 100~1000以内的素数,可以简单处理下打表输出:

#includeusing namespace std;bool vis[1000];int p[1000];int idx=0;int main(){for(int i=2;i<1e3;i++){if(!vis[i]){p[idx++]=i;for(int j=i*i;j<1e3;j+=i)vis[j]=1;}}for(int i=0;i=100)cout<<p[i]<<",";    return 0;}

结果: 

101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997,

-------------------------------------------------------------------------------------------------------------------------------- 

 如果求0~10000以内的合数的最小质因数(我们知道,x以内的合数的最小质因数一定不超过√x),所以求10000以内的质因数最多100个。

概念补充:

合数是指在大于1的整数中除了能被1和本身整除外,还能被其他数(0除外)整除的数。与之相对的是质数,而1既不属于质数也不属于合数。最小的合数是4。

质因数(素因数或质因子)在数论里是指能整除给定正整数的质数。除了1以外,两个没有其他共同质因子的正整数称为互质。

整除与被整除:若整数 b 除以非零整数 a ,商为整数,且余数为 0 ,则 b 能被 a 整除(或者说 a 能整除 b)。其中 b 为被除数,a 为除数。a 称作 b 的约数(因数),b 称作 a 的倍数。
除和除以:2
6 即 “6 ÷ 2“;6 除以 2 即 ”6 ÷ 2“。

#includeusing namespace std;bool vis[10000];int p[100];int idx=0;int main(){for(int i=2;i<sqrt(1e4);i++){if(!vis[i]){p[idx++]=i;for(int j=i*i;j<1e4;j+=i)vis[j]=1;}}for(int i=0;i<idx;i++)cout<<p[i]<<",";    return 0;}

结果: 

2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,