//线性筛法--有测试代码
/*
数论 - 欧拉筛法(线性筛)的解释
https://blog.csdn.net/Losk_0/article/details/87884390
素数筛法详解(欧拉筛&埃氏筛)
https://blog.csdn.net/FeilingGong/article/details/83660779
算法笔记(四)——欧拉筛法求素数
https://blog.csdn.net/weixin_42172676/article/details/81978475
快速线性筛法的原理和值得借鉴的方法【解析算法】
https://blog.csdn.net/nuanxin_520/article/details/41207145
快速线性筛法的特点就是不会重复筛除一个合数。它的原理是
前提是:一个合数 i=p1*p2*...*pn, pi都是素数(2<=i<=n)pi<=pj( i<=j )
p1是最小的系数。这样每一个合数就有一个确定的表示方法,不会重复。(像12=2*2*3)
No.1:我们现在规定一个合数由两个数得到。
NO.2:那么合数有两种。
1.素数*素数=合数
2.一个最小的素数*合数=合数
筛除:
如果遇到i为素数,那么一个大的素数 i 乘以不大于 i 的素数,
这样筛除的数跟之前的是不会重复的,前面已经通过比i小的质数筛掉了
i为素数,前面的素数肯定不能将素数i筛掉
如果遇到i为合数,我们只认为合数由一个最小的素数*合数得到,
也不会重复(就像12=2*6而不是12=3*4)
则i必然可以由i前面的质数*(一个质数或合数)组成i这个数
6=2*3
一般的线性筛法
https://www.cnblogs.com/KyleDeng/p/9244850.html
要保证的是每个合数只被这个合数最小的质因子筛除,而且只筛一次,没有重复筛除
*/
#include <bits/stdc++.h>
using namespace std;
int const MAX_N=10000+10;
int v[MAX_N],prime[MAX_N];
int n;
void primes(int n)
{
int m;
memset(v,0,sizeof(v));
//质数的个数
m=0;
/*
1、如果遇到i为素数,那么一个大的素数 i 乘以不大于 i 的素数,
这样筛除的数跟之前的是不会重复的
2、如果遇到i为合数,我们只认为合数由一个最小的素数*合数得到,
也不会重复(就像12=2*6而不是12=3*4)
*/
for(int i=2;i<=n;++i)
{
if( v[i]==0)
{
//记录每个数的最小质因子
v[i]=i;
prime[++m]=i;
cout<<"质数i="<<i<<endl;
}
for(int j=1;j<=m;++j)
{
//i有比prime[j]更小的质因子,或者超出n的范围
if( prime[j]>v[i] || prime[j]>n/i)
{
cout<<"prime["<<j<<"]="<<prime[j]<<" v["<<i<<"]="<<v[i]<<endl;
cout<<n<<"/"<<i<<"="<<n/i<<endl;
cout<<"&&&&&&&&&&&&&&&&&&&&&&&&&&&&"<<endl;
break;
}
//prime[j]是合数i*prime[j]的最小质因子
v[i*prime[j]]=prime[j];
cout<<"i="<<i<<" j="<<j<<" prime["<<j<<"]="<<prime[j]<<endl;
cout<<i<<"*"<<prime[j]<<"="<<i*prime[j]<<endl;
cout<<"v["<<i*prime[j]<<"]="<<v[i*prime[j]]<<endl;
cout<<"-------------------------"<<endl;
}
//cout<<"**************************************"<<endl;
}
for(int i=1;i<=m;++i)
{
cout<<prime[i]<<endl;
}
}
int main( void )
{
cin>>n;
primes(n);
return 0;
}
参考相关链接:
数论 - 欧拉筛法(线性筛)的解释
https://blog.csdn.net/Losk_0/article/details/87884390
素数筛法详解(欧拉筛&埃氏筛)
https://blog.csdn.net/FeilingGong/article/details/83660779
算法笔记(四)——欧拉筛法求素数
https://blog.csdn.net/weixin_42172676/article/details/81978475
快速线性筛法的原理和值得借鉴的方法【解析算法】
https://blog.csdn.net/nuanxin_520/article/details/41207145