線性篩,求質數(素數)
#include <bits/stdc++.h> //萬能庫
using namespace std;
typedef long long ll; //把long long 用 ll表示,節約書寫時間
int const maxn=1e5+5; //定義一個數值maxn為100005
ll prime[maxn]; //儲存質數的陣列
bool check[maxn]; //用來檢查是否質數的倍數被篩出來的陣列
void primelist(ll n) //獲得質數表的函式 注意:篩選的是小於n的所有質數
{
ll cnt=0; //用來記錄質數的數量
memset(check,false,sizeof(check)); //先將bool型別check陣列每一位置為false
for(int i=2;i<n;++i) //開始從第一位質數開始,如果是就記錄在prime陣列中
{
if(!check[i]) //如果這一位沒有被標記過,證明這個數是質數
{
prime[++cnt]=i; //把這個數搞進質數表中 同時 質數數量+1
}
for(int j=1;j<=cnt;j++) // 開始遍歷,把當前質數的倍數都篩掉 ——>意味著 bool型別陣列check置為true這樣以後就不會把質數的倍數儲存到質數表中
{
if(i*prime[j]>n)break; //如果超過一開始的數值n了就退出迴圈
check[i*prime[j]]=true; //標記操作
}
}
}
int main()
{
ios::sync_with_stdio(false);// 想了解此語句的複製此語句百度即可
ll n;
cin>>n;
primelist(n); //呼叫primelist函式,獲得小於n的質數表
for(int i=1;i<10;i++) //此處演示列印前10位質數
{
cout<<prime[i]<<" ";
}
return 0;
}
————————————————
版權宣告:本文為CSDN博主「upczsh」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/qq_43850598/article/details/98224082