1013 数素数 (20分)
今天最重要的不是这道题,而是今天是2020.02.29,你发现了吗?四年一遇啊!!!赶紧记录一下,哈哈。
不知道你看到这篇文章的时候是在哪一年的哪一月哪一日呢?
言归正传,这道题两种方法来做,第一种方法是常规方法,第二种方法是“素数筛法”。
法一:
#include<iostream>
#include<cmath>
using namespace std;
int isSuShu[500000];
int main()
{
//freopen("in.txt","r", stdin);
int counts=1,j,i=2;
while(1)
{
int k = (int)sqrt((double)i);
for(j=2;j<=k;j++)
if(i%j == 0)
break;
if(j>k)
isSuShu[counts++] = i;
if(counts>10000)
break;
i++;
}
int m,n;
cin>>m>>n;
for(int i=m;i<=n;i++)
{
cout<<isSuShu[i];
if((i-m+1)%10 == 0)
cout<<endl;
else if(i!=n)
cout<<" ";
}
return 0;
}
缺点:运行时间较长,时间复杂度高。
法二:
#include<iostream>
using namespace std;
#define maxn 104730 //首先打标得出第10000个素数的大小是104729
int prime[maxn], pnum=1;
bool p[maxn] = {0};//false为素数,true为合数
void find_Prime()
{
for(int i=2;i<maxn;i++)
{
if(!p[i]){
prime[pnum++] = i;
for(int j=i+i;j<maxn;j+=i)
p[j] = true;
}
}
}
int main()
{
find_Prime();
// cout<<prime[10000]<<endl;//104729
int m,n;
cin>>m>>n;
int flag=0;
for(int i=m;i<=n;i++)
{
cout<<prime[i];
flag++;
if(flag % 10 == 0)
cout<<endl;
else if(i!=n)
cout<<" ";
}
return 0;
}