对于数据个数比较少的题目来说,求某一范围内的素数问题,可以直接用传统的枚举方法来判断即可。下面是怎么判断一个数是不是素数。
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去初始化数组。