时间限制:1000 ms | 内存限制:65535 KB
难度:3
描述现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数。
输入给出一个正整数数N(N<=2000000)
但N为0时结束程序。
测试数据不超过100组输出将2~N范围内所有的素数输出。两个数之间用空格隔开样例输入
5
10
11
0
样例输出
2 3 5
2 3 5 7
2 3 5 7 11
同一道题,虽然用同一种方法,但是,效率还是有差别的....
试除法。。。(1)
也是我们最常用的。。。来打表(素数表)
代码:
#include<stdio.h>
#define maxn 150000
int arr[maxn]={2,3,5,7,11};
int main()
{
int n,i,j,k=5;
for(i=13;i<=1999993;i++)
{
for(j=2;j*j<=i;j++)
{
if(i%j==0) break;
}
if(j*j>i) arr[k++]=i;
}
while(scanf("%d",&n),n)
{
for(i=0;arr[i]<=n&&arr[i]!=0;i++)
{
if(i==0)
printf("%d",arr[i]);
else
printf(" %d",arr[i]);
}
printf("\n");
}
return 0;
}
效率不是非常的高.....
有一种比较快的方法,打表。
模板为:
int prime[200000];
bool bo[10000001];
int prime_table()
{
int i,j,flag=0;
memset(bo,0,sizeof bo);
bo[0]=bo[1]=1;
for(i=2;i<=1000;i++)
{
if(!bo[i])
{
for(j=i*i;j<=len;j+=i)
bo[j]=1;
}
}
for(i=0;i<=len;i++)
if(!bo[i])
prime[flag++]=i;
return flag //在该范围内的个数....
}
代码:
#include<stdio.h>
#define maxn 150000
#define len 1999993
int prime[maxn]; //存储素数
bool isprime[len+1]={1,1}; //用来判断是否为素数,1代表不是,0代表是
void prime_table()
{
int i,j,flag=0;
for(i=2;i*i<=len;i++) //对于在给定的范围内,就是打表的范围内
{
if(!isprime[i])
{
for(j=i*i;j<=len;j+=i)
isprime[j]=1;
}
}
for(i=0;i<=len;i++)
if(!isprime[i])
prime[flag++]=i;
}
int main()
{
int n,i;
prime_table();
while(scanf("%d",&n),n)
{
printf("%d",prime[0]);
for(i=1;prime[i]<=n&&prime[i]!=0;i++)
printf(" %d",prime[i]);
printf("\n");
}
return 0;
}
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有