線性篩——尤拉篩 C++程式實現 洛谷 模板題 P3383
阿新 • • 發佈:2019-02-18
洛谷 模板題 P3383
題目描述
如題,給定一個範圍N,你需要處理M個某數字是否為質數的詢問(每個數字均在範圍1-N內)
輸入輸出格式
輸入格式:第一行包含兩個正整數N、M,分別表示查詢的範圍和查詢的個數。
接下來M行每行包含一個不小於1且不大於N的整數,即詢問該數是否為質數。
輸出格式:輸出包含M行,每行為Yes或No,即依次為每一個詢問的結果。
輸入輸出樣例
輸入樣例#1:100 5 2 3 4 91 97輸出樣例#1:
Yes Yes No No Yes
#include<iostream>
using namespace std;int tot=0;//素數的個數
int p[10000001];//對不是素數的數進行標記
int c[10000001];//c[i]表示第i個素數
int n,m;
int sushu(int x)//在1-x中 把合數 標記{
for(int i=2;i<=x;i++)//從2開始
{
if(p[i]!=1)c[tot++]=i;//如果迴圈到i的時候 i沒被標記 那麼i就是 一個素數
for(int j=0;j<tot;j++)
{
if(i*c[j]>x)break; //不用對超出範圍的數進行判斷
p[i*c[j]]=1;//讓i與之前查詢到的素數相乘得到的數一定是合數
if(i%c[j]==0)break;//如果i是 之前查詢到的素數的倍數 就可以跳出來換下一個i
}
}
int main()
{
cin>>n>>m;//1-n的範圍 m次詢問
sushu(n);
for(int i=1;i<=m;i++)
{
cin>>n;
if(n==1)//1既不是素數 也不是合數
{
cout<<"No"<<endl;
continue;
}
if(p[n])
{
cout<<"No"<<endl;
}
else cout<<"Yes"<<endl;
}
}