题目描述
令Pi表示第i个素数。现任给两个正整数M <= N <= 10000,请输出PM到PN的所有素数。
输入描述:
输入在一行中给出M和N,其间以空格分隔。
输出描述:
输出从PM到PN的所有素数,每10个数字占1行,其间以空格分隔,但行末不得有多余空格。
输入例子:
5 27
输出例子:
11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103
素数判断方法:
一:枚举法
(效率O(n*sqrt(n))),按照素数的定义从2-枚举到sqrt(n)
bool isprime(int n) { for (int i=2;i<=sqrt(n);i++) { if (n%i==0) return false; } return true; }
二:素数筛法
假设求1到10所有的素数,定义一个bool数组,初始值为0,即为素数。
第一步:将2的倍数设为1
第二步:i = 3,prime[3] = 0,将3的倍数都设为1
第三步:i= 4>sqrt(10)算法结束
#define MAX 100 bool prime[MAX]; for(int i = 3; i < MAX; i+=2) { prime[i] = 1; } for(int i = 2; i < sqrt(MAX); i++) { if(prime[i] == 0) { for(int j = (2*i+1); j < MAX; j+= (i+1)) { prime[j] = 1; } } }
这道题中枚举法速度和内存占用更优化。
枚举:(摘自 https://blog.csdn.net/zxtalentwolf/article/details/80406769)
#include<iostream> #include<cmath> #include<vector> using namespace std; bool isPrime(int n){ if(n<=2) return true; int t=sqrt(n); for(int i=2;i<=t;i++){ if(n % i == 0) return false; } return true; } void output(vector<int> x,int M,int N){ int num=0; for(int i=M;i<=N;i++){ if(num!=0){ cout<<" "; } cout<<x[i]; num++; if(num==10){ cout<<endl; num=0; } } } int main(){ int M,N; cin>>M>>N; vector<int>x; for(int i=1;x.size()<=N;i++){ if(isPrime(i)){ x.push_back(i); // cout<<i<<endl; } } output(x,M,N); return 0; }
筛选:
#include<iostream> using namespace std; #include<cmath> #define MAX 10000 int main() { bool prime[MAX]; int M, N; cin>>M>>N; for(int i = 3; i < MAX; i+=2) { prime[i] = 1; } for(int i = 2; i < sqrt(MAX); i++) { if(prime[i] == 0) { for(int j = (2*i+1); j < MAX; j+= (i+1)) { prime[j] = 1; } } } int count = 0; int count1 = 0; for(int i = 0; i < MAX; i++) { if(prime[i] == 0) { count++; if(count >= (M+1) && count <= (N+1)) { count1++; if(count1 % 10 != 0 && count != (N+1)) { cout<<i+1<<" "; } if(count1 % 10 == 0 or count == (N+1)) { cout<<i+1<<endl; } } } } }