素数的判断和怎么得到某个数据范围内的素数问题

本文介绍了如何判断素数,对于小范围数据可使用枚举方法,大数据量时则采用埃氏筛法。在实现过程中,通过代码示例展示了数组初始化的问题,提醒程序员在初始化数组时最好使用memset以避免潜在错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于数据个数比较少的题目来说,求某一范围内的素数问题,可以直接用传统的枚举方法来判断即可。下面是怎么判断一个数是不是素数。

​

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


  bool isPrime(int num)
 {/*第二种方法i容易溢出,所以用long long*/
	 if(num <= 1)
		 return false;
	 for(long long i = 2; i * i <= num; i++)
	 { 
		if(num % i == 0)
			return false;
	 }
	 return true;
 }
 
 

​

 对于数据量比较大的时候,可以用埃氏筛法,下面是埃氏筛法代码:

 

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

完整的代码如下:

#include<bits/stdc++.h>
using namespace std;

const int maxn = 100010;
int prime[maxn];  //用来存放某一个范围内的素数
bool judge[maxn];  //因为考虑到数据个数很多,所以将该数组放在main函数外面

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;
}



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

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

int main()
{
	int N;
	scanf("%d",&N);
	int temp = getPrime(N);
	printf("%d\n",temp);
	
	for(int i = 0; i < temp; i++)
		printf("%d ",prime[i]);
	printf("\n");
	return 0;
}

一个小插曲:在定义一个数组的时候,直接初始化,例如:bool judge[1000] = {true};

for(int i = 0; i < 1000; i++)

 cout<<judge[i]<<" ";

发现了一个问题,打印出来,只有第一个元素是1,其他值全为0,导致函数getPrime出错,但是改用memset之后就好了!

所以建议大家使用menset去初始化数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值