PAT 07-3 求素数

求素数,这是一个“古老”的问题,每个学过编程的人都应该碰到过,这里是求第M+1到第N个素数,这么经典的问题,当然得给它写上一笔,下面是题设要求及代码实现

 1 /*
 2     Name:
 3     Copyright:
 4     Author:
 5     Date: 01/04/15 19:19
 6     Description:
 7 令Pi表示第i个素数。现任给两个正整数M <= N <= 104,请输出PM到PN的所有素数。
 8
 9 输入格式:
10
11 输入在一行中给出M和N,其间以空格分隔。
12
13 输出格式:
14
15 输出从PM到PN的所有素数,每10个数字占1行,其间以空格分隔,但行末不得有多余空格。
16
17 输入样例:
18 5 27
19 输出样例:
20 11 13 17 19 23 29 31 37 41 43
21 47 53 59 61 67 71 73 79 83 89
22 97 101 103
23 */
24
25 #include <stdio.h>
26 #include <math.h>
27 #include <stdbool.h>
28
29 void print(int M, int N);
30 bool isprime(int n);
31
32 int main()
33 {
34     int M, N;
35
36     scanf("%d%d", &M, &N);
37     print(M, N);
38
39     return 0;
40 }
41
42 void print(int M, int N)
43 {
44     int i, cnt;
45
46     for(i = 2, cnt = 0; cnt < N; i++)
47     {
48         if(isprime(i))
49         {
50             cnt++;
51
52             if(cnt >= M)
53             {
54                 printf("%d", i);
55                 if((cnt - M + 1) % 10 != 0 && cnt < N)
56                         printf(" ");
57                 else
58                     printf("\n");
59             }
60         }
61     }
62 }
63
64 bool isprime(int n)
65 {
66     int i, tmp;
67
68     tmp = sqrt(n);
69     for(i = 2; i <= tmp; i++)
70     {
71         if(n % i == 0)
72             return false;
73     }
74
75     return true;
76 }
时间: 2024-10-09 21:04:41

PAT 07-3 求素数的相关文章

筛选法求素数

筛选法求素数,不断的用3,5,7,等素数作为筛子,筛除这些数的倍数,即将合数筛除.用辅助数组p记录数i是否是素数. vector<int> prime(int n) { vector<int> p(n+1); for(int i=2;i<=n;i+=2) { if(i%2==0&&i>2) p[i]=0; else p[i]=1; } for(int i=3;i<=(int)(sqrt((double)n));i+=2) { if(p[i]) fo

C语言最优化求素数

初学C语言,看到求素数的代码,不是太满意,自己设计了一个计算流程图.在贴吧里也问了一下,和"埃拉托色尼(Eratosthenes)筛法”有些撞车,当然在下不敢与数学巨匠们争长短,不过还是想自己试一下. 百度了一下有人已经用这类方法做了代码,不过和我的想法有出入. 思路: 1要避免冗余的求余计算的计算次数,这样在数字足够大的时候更能体现更高的计算效率, 1)分母排除偶数,可以减少一半的计算量.具体做法是改+1递增为从第二个素数3开始+2递增; 2)筛选求余计算的分子,而根据素数的定义,只要不被小于

Algorithm --&gt; 筛法求素数

一般的线性筛法 genPrime和genPrime2是筛法求素数的两种实现,一个思路,表示方法不同而已. #include<iostream> #include<math.h> #include<stdlib.h> using namespace std; const int MAXV = 100; //素数表范围 bool flag[MAXV+1]; //标志一个数是否为素数 int prime[MAXV+1]; //素数表,下标从0开始 int size=0; //

POJ2739_Sum of Consecutive Prime Numbers【筛法求素数】【枚举】

Sum of Consecutive Prime Numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19350 Accepted: 10619 Description Some positive integers can be represented by a sum of one or more consecutive prime numbers. How many such representations d

筛法求素数

筛法求素数,寻找素数最经典快速的方法!!! 用筛法求素数的基本思想是: 把从1开始的.某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉.剩下的数中选择最小的数是素数,然后去掉它的倍数.依次类推,直到筛子为空时结束.如有: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1不是素数,去掉.剩下的数中2最小,是素数,去掉2的倍数,余下的数是: 3 5 7 9 11 13 1

uva 10375 唯一分解定理 筛法求素数【数论】

唯一分解理论的基本内容: 任意一个大于1的正整数都能表示成若干个质数的乘积,且表示的方法是唯一的.换句话说,一个数能被唯一地分解成质因数的乘积.因此这个定理又叫做唯一分解定理. 举个栗子:50=(2^1)*(5^2) 题目一般的思路就是要把素数表打出来,eg上面的例子 e={1,0,2,0,0......} 下面是两个题目,仅说说大致的思想: 题目一: E=(X1*X3*X4* ...*Xk)/X2   判断E是不是整数 如果把(X1*X3*X4* ...*Xk)分解成素数相乘,将X2也分解成素

JD 题目1040:Prime Number (筛法求素数)

OJ题目:click here~~ 题目分析:输出第k个素数 贴这么简单的题目,目的不清纯 用筛法求素数的基本思想是:把从1開始的.某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉.剩下的数中选择最小的数是素数,然后去掉它的倍数. 依次类推.直到筛子为空时结束. 如有: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1不是素数.去掉.剩下的数中2最小,是素数,去掉2的

HDU2710_Max Factor【水题】【筛法求素数】

Max Factor Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3966    Accepted Submission(s): 1289 Problem Description To improve the organization of his farm, Farmer John labels each of his N (1

筛法求素数的最优算法+解释

筛法求素数: 求n内的素数.先用2去筛,即把2留下,把2的倍数剔除掉:再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉:接下去用下一个质数5筛,把5留下,把5的倍数剔除掉:不断重复下去……. 由此,我们可以写出基础版的筛法求素: const int maxn = 102410240; bool isp[maxn]; void init() { memset(isp, true, sizeof(isp)); isp[0] = isp[1] = false; const int max1 =