pat b1013 数素数 (20分)

题目:

https://www.nowcoder.com/pat/6/problem/4079

https://pintia.cn/problem-sets/994805260223102976/problems/994805309963354112 

令 P​i​​ 表示第 i 个素数。现任给两个正整数 M≤N≤10​4​​,请输出 P​M​​ 到 P​N​​ 的所有素数。

输入格式:

输入在一行中给出 M 和 N,其间以空格分隔。

输出格式:

输出从 P​M​​ 到 P​N​​ 的所有素数,每 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

1、筛法:

#include<iostream>
using namespace std;

const int maxn=1000001;
int prime[maxn];
int pnum=0;
bool flag[maxn];  //true: 不是素数  false: 是素数 

void find_prime(int n)
{
	for(int i=2;i<maxn;i++)
	{
		if(flag[i]==false)
		{
			prime[pnum++]=i;
			for(int j=i+i;j<maxn;j+=i)
			{
				flag[j]=true;
			}
		}
		if(pnum==n) break;
	}	
}

int main()
{
	int m,n;
	cin>>m>>n;
	find_prime(n);
	int num=0;
	
	for(int i=m-1;i<n;i++)
	{
		cout<<prime[i];
		num++;
		if(i==n-1) break;
		if(num%10==0) cout<<endl;
		else cout<<' ';
	}
		
	return 0;
}

2、暴力法

//超时,19分

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;

const int maxn=10010; 
int prime[maxn];
int pnum=0;

bool isPrime(int n)
{
	if(n<=1) return false;
	else
	{
		int sqr=(int)sqrt(1.0*n);
		for(int i=2;i<n;i++)
		{
			if(n%i==0) return false;
		}
		return true;
	}		
}

void find_prime(int n)
{
	int i=2;
	while(1)
	{
		if(isPrime(i)==true)
		{
			prime[pnum++]=i;
		}
		i++;
		if(pnum==n) break;		
	}	
}


int main()
{
	int m,n;
	cin>>m>>n;
	find_prime(n);
	int num=0;
	
	for(int i=m-1;i<n;i++)
	{
		cout<<prime[i];
		num++;
		if(i==n-1) break;
		if(num%10==0) cout<<endl;
		else cout<<' ';
	}
		
	return 0;
}
发布了146 篇原创文章 · 获赞 60 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/OpenStack_/article/details/103893301
今日推荐