线性筛法--有测试代码
生活随笔
收集整理的這篇文章主要介紹了
线性筛法--有测试代码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
//線性篩法--有測試代碼
/*
數論 - 歐拉篩法(線性篩)的解釋
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
一般的線性篩法
https://www.cnblogs.com/KyleDeng/p/9244850.html
總結
以上是生活随笔為你收集整理的线性筛法--有测试代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1286:怪盗基德的滑翔翼(错)
- 下一篇: 微信小程序多图上传带进度提示的代码实例