素数打表基础练习,WA了3次竟然是因为最后输出之前的判断写反了。。。
由于题目最大的输入只有2541,因此数组只写到2550就足够了。
#include <stdio.h>
int Sushubiao[2550]={0};
void preCal()
{
for(int i=2;i<2550/2;i++)
{
if(Sushubiao[i])
continue;
for(int j = 2; j*i<2550;j++)
Sushubiao[j*i] = 1;
}
}
void main()
{
preCal();
int x,y;
while(scanf("%d %d",&x,&y) && (x||y))
{
bool bAllPrime = true;
for(int i = x; i <= y;i++)
if(Sushubiao[i*i+i+41])
bAllPrime = false;
if(bAllPrime)
printf("OK\n");
else
printf("Sorry\n");
}
}
以下文章介绍了4种素数打表法:最后一种是最高效率的
https://blog.csdn.net/gtuif/article/details/73732070
欧拉筛法通过红色标记部分保证每个合数只会被它的最小质因数筛去,时间复杂度降低到O(n)。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<sstream>
using namespace std;
#define N 100000
int h=0;
bool p[N];
int prime[N];
void db()
{
memset(p,true,sizeof(p));
for(int i=2;i<N;i++)
{
if(p[i]==true)
{
prime[h++]=i;
}
for(int j=0;j<h&&i*prime[j]<N;j++)
{
p[i*prime[j]]=false;
if(i%prime[j]==0) break;
}
}
}
int main()
{
db();
int n; //打印前n个质数
cin>>n;
for(int i=0;i<n;i++)
cout<<prime[i]<<" ";
return 0;
}