NYOJ 187

快速查找素数

时间限制: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 <iostream>
 2 #include<stdio.h>
 3 #include <cstring>
 4 using namespace std;
 5
 6 const int MAXN = 2000000;
 7 bool u[MAXN];
 8 int  prime[MAXN], cnt = 0;
 9 void primer(){
10     memset(u, true, sizeof(u));
11     for(int i=2; i<MAXN; ++i){
12         if(u[i]) prime[cnt++] = i;
13         for(int j=0; j<cnt && i*prime[j]<MAXN; ++j){
14             u[i*prime[j]] = false;
15             if(0 == i%prime[j]) break;
16         }
17     }
18 }
19 //
20 int getnum(int n){
21     int left = 0,right = cnt-1;
22     int middle=(left+right)/2 ;
23     while(prime[middle]!=n&&right>=left ){
24         if(n<prime[middle]) right = middle-1;
25         else left= middle+1;
26         middle = (left+right)/2;
27     }
28     return middle;
29 }
30
31 int main(){
32     int n;    primer();
33     while(1){
34         scanf("%d",&n);
35         if(n==0) break;
36         for(int i=0;i<getnum(n )+1;i++ ){
37             printf("%d ",prime[i] ) ;
38         }
39         printf("\n");
40     }
41     return 0;
42 }

下面曝一种其他同学的写法:也是筛法,但是比较单一,比较简单,但是却能AC。

 1 #include<stdio.h>
 2
 3 int main(){
 4     int n,i,s,j;
 5     bool a[2000005]={0};
 6     a[0]=1;a[1]=1;
 7
 8     //并没有考虑可能重复筛选的数字
 9     for(i=2;i<2000001;i++){
10         if(a[i]==0){
11             for(j=i+i;j<=2000001;j=j+i)
12                 a[j]=1;
13         }
14     }
15
16     while(scanf("%d",&n)!=EOF&&n!=0){
17         s=0;
18         for(i=2;i<=n;i++){
19             if(a[i]==0){
20                 s++;
21                 if(s==1) printf("%d",i);
22                 if(s>1) printf(" %d",i);
23             }
24         }
25         printf("\n");
26     }
27     return 0;
28 }
时间: 2024-10-12 00:03:31

NYOJ 187的相关文章

NYOJ 187 快速查找素数

快速查找素数 时间限制: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> #include<m

快速查找素数 NYOJ 187

1 #include<stdio.h>//快速查找素数(187) 2 int a[2000001]; 3 int main() 4 { 5 int m,i,j; 6 for(i=2;i<=2000000;i++){ 7 if(a[i]==0){ 8 for(j=i+i;j<=2000000;j=j+i){ 9 a[j]=1; 10 } 11 } 12 } 13 while(scanf("%d",&m)&&m!=0){ 14 for(i=2

NYOJ 237 游戏高手的烦恼 &amp;&amp; POJ3041-Asteroids ( 二分图的最大匹配 )

链接: NYOJ 237  游戏高手的烦恼:click here~~ POJ  3041 Asteroids           :click here~~ 题意: 两题一样,翻译不同而已. 有一位传说级游戏高手,在闲暇时间里玩起了一个小游戏,游戏中,一个n*n的方块形区域里有许多敌人,玩家可以使用炸弹炸掉某一行或者某一列的所有敌人.他是种玩什么游戏都想玩得很优秀的人,所以,他决定,使用尽可能少的炸弹炸掉所有的敌人. 现在给你一个游戏的状态,请你帮助他判断最少需要多少个炸弹才能炸掉所有的敌人吧.

NYOJ 49 开心的小明

开心的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 小明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N 元钱就行".今天一早小明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的N 元.于是,他把每件物品规定了一个重要度,分为5 等:用整数1~5 表示,第5 等最重要.他还从因特网上查到了每件物品的价格(都是整数元).

NYOJ 106 背包问题

背包问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=10):如果给你一个背包它能容纳的重量为m(10<=m<=20),你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大. 输入 第一行输入一个正整数n(1<=n<=5),表示有n组测试数据: 随后有n测试数据,每组测试数据的第一行有两个正整数s,m(1<=s<=10

NYOJ 289 苹果

苹果 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 ctest有n个苹果,要将它放入容量为v的背包.给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值. 输入 有多组测试数据,每组测试数据第一行为2个正整数,分别代表苹果的个数n和背包的容量v,n.v同时为0时结束测试,此时不输出.接下来的n行,每行2个正整数,用空格隔开,分别代表苹果的大小c和价钱w.所有输入数字的范围大于等于0,小于等于1000. 输出 对每组测试数据输出一个整数,代表能放入背包的苹

nyoj 括号匹配

这个方程有两种形式,本文采用 if(s[i]=s[j]) dp[i][j]=d[i-1][j-1] dp[i][j]=min(dp[i][k]+dp[k+1][j],dp[i][j]) (i=<k<j) 其实与另一种方法比较:根据j的所有匹配情况取最小值 1.i到j无匹配,取为dp[i][j-1]+1 2.列举所有匹配情况 dp[i][k-1]+dp[k+1][j] 取上述所有情况最小值 两者都能获得正确的结果. 同时两者的初始化为 dp[i][j]==1 if(i==j) 规划方向为:  

SGU 187.Twist and whirl - want to cheat( splay )

维护一个支持翻转次数M的长度N的序列..最后输出序列.1<=N<=130000, 1<=M<=2000 splay裸题... ------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 130009;

NYOJ 461-Fibonacci数列(四)(求斐波那契数列前4位)

题目地址:NYOJ 461 思路:斐波那契数列的通项公式为 然后下一步考虑如何产生前4位: 先看对数的性质,loga(b^c)=c*loga(b),loga(b*c)=loga(b)+loga(c);假设给出一个数10234432, 那么log10(10234432)=log10(1.0234432*10^7)[用科学记数法表示这个数]=log10(1.0234432)+7; log10(1.0234432)就是log10(10234432)的小数部分. log10(1.0234432)=0.0