题目描述
令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;
}
}
}
}
}