nyoj187:筛选法——快速查找素数

数论模块的一道基础题,考察的就是筛选法——快速查找素数,在nyoj上已经通不过了,可能OJ内部出现了问题,一直显示超时,可以在XYOJ:http://xyoj.xynu.edu.cn/problem.php?id=1913  或者:http://115.159.40.116/ 提交,只要是筛选法都可以A。

下面我给出nyoj上的题目介绍吧。

快速查找素数

时间限制: 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

#include<stdio.h>
#define MAX 2000000
bool vis[MAX];		//利用bool型数组,false表示不是素数,true表示素数 
void is_prime()		//将一定范围内的素数判断结果全部存到数组里 
{			
	int i,j;
	vis[1]=false;	//1不是素数,先标记好 
	for(i=2;i<=MAX;i++)		//利用for循环给bool数组初始化为true应该比memset快 
		vis[i]=true;	
	for(i=2;i*i<=MAX;i++)		//从2开始判断,i*i可以优化一些步骤,减少一些时间 
	{
		if(vis[i]==false)		//如果这个数已经别标记过不是素数,直接跳过 
			continue;
		for(j=i*i;j<=MAX;j+=i)	//开始筛选,把里面是一些素数的倍数全都标记出来为false,i*i可以优化一些步骤 
			vis[j]=false;
	}
}
int main()
{
	is_prime();	//记得在主函数内调用 
	int n,i;	
	while(scanf("%d",&n)!=EOF&&n!=0)		//这个是顺应NYOJ上的一道题,多组数据,输入0结束 
	{
		for(i=2;i<=n;i++)		//进行输出 
		{
			if(vis[i]==true)		//如果被标记为true,就输出 
				printf("%d ",i); 
		}
		printf("\n");
	}
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值