PAT B1013 数素数 (20 分)

附上题目链接:

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

这道题目,有一点需要注意的就是,找出一个包含了10000个素数的范围,下面提供一下简单的代码:

这段代码基本上包含三个部分:

1.怎么判断一个数是素数

2.怎么判断某个范围内的数哪些是素数,并且保存下来

第一点和第二点都可以参考我的另一篇博客:https://mp.csdn.net/postedit/89648390

3.在主函数里面输出,保证格式正确

分成以上三点进行思考,可以保证思路清晰。

int getPrime()
{
	memset(judge,true,sizeof(judge));   //将数组初始化为TRUE
	int count = 0;               //用来计算在0~num范围内素数的个数
	for(int i = 2; i <= maxn; i++)
	{	
		if( judge[i]== true && isPrime(i)== true)
		{
			prime[count++] = i;			
			//如果i是素数的话,就将i的倍数全部变为FALSE,false表示这个数不是素数
			for(int j = i+i;j <= maxn; j += i)
				judge[i] = false;
		}
	}
	return count;  //通过返回值就可以判断素数的个数,然后再根据返回值调整maxn和maxn1的大小,不正 
                   //内存不超,也保证不会出现段错误
}

 下面是完整的代码,简单叙述一下自己在做本道题目遇到的麻烦(调试了好几次,都出现各种各样的问题,怪自己太粗心):

1.找到一个包含10000个素数的范围,确定maxn和maxn1的范围,注意maxn1不是10000,而是根据你选的maxn来确定;

2.按照格式输出,基本没啥问题,但是新手需要多注意一下呢!

 

#include
using namespace std;

const int maxn = 110000;
const int maxn1 = 11000;
int prime[maxn1];  //用来存放某一个范围内的素数
bool judge[maxn];  
//初始化为true,表示所有的数都满足条件,然后再将一些不是素数的元素的值置成false

bool isPrime(int num)
{
	//判断一个数是不是一个素数
	if(num <= 1)
		return false;
	for(int i = 2; i <=(int)sqrt(num*1.0); i++)
	{
		if(num % i ==0)
			return false;
	}
	return true;
}



//	埃氏筛法求某一个范围内素数

void getPrime()
{
	memset(judge,true,sizeof(judge));   //将数组初始化为TRUE
	int count = 0;               //用来计算在0~num范围内素数的个数
	for(int i = 2; i <= maxn; i++)
	{	
		if( judge[i]== true && isPrime(i)== true)
		{
			prime[count++] = i;			
			//如果i是素数的话,就将i的倍数全部变为FALSE,false表示这个数不是素数
			for(int j = i+i;j <= maxn; j += i)
				judge[i] = false;
		}
	}
	//return count;
}

int main()
{
	int m,n;
	scanf("%d%d",&m,&n);
	getPrime();

    //格式化输出
	int add = 0;
	for(int i = 0; i <= n-m;i++)
	{
		add++;
		if(add < 10)
		{
			if(i == n-m)
				printf("%d\n",prime[i+m-1]);
			else
				printf("%d ",prime[i+m-1]);
		}
		if(add == 10)
		{
			printf("%d\n",prime[i+m-1]);
			add = 0;
		}
	}
	return 0;
}

 

你可能感兴趣的:(数据结构和算法)