前言
质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数。
1. 素数的判定
方法1
bool IsSushu(const int num)
{
if(num < 2)
return false;
int temp(num);
for(int i=2; i<temp; ++i)
{
if(temp%i == 0)
return false;
}
return true;
}
方法2
bool IsSushu_Sqrt(const int num)
{
if(num < 2)
return false;
int temp(num);
int loop = (int)sqrt(temp);
for(int i=2; i<=loop; ++i)
{
if(temp%i == 0)
return false;
}
return true;
}
这里使用num的平方根作为循环的上界,是因为每个整除num的整数a,都有一个整数b使得a*b=num。如果a>loop,那么b<loop。因而当数字a大于loop时就不需要进行检查了,已经检查过了。
2. 素数序列生成
这里使用埃拉托斯尼特筛选法,埃拉托斯尼特筛选法能够非常高效地生成素数的序列,原理是剔除所有可能被素数整除的非素数。
//求取当前素数的下一个素数
int GetNextSushu(const int start, const int max_num, bool* flag)
{
int next(start+1);
while(!flag[next] && next<=max_num)
++next;
return next;
}
//给出小于max_num的全部素数
std::vector<int> GetSushu(const int max_num)
{
std::vector<int> vec;
if(max_num < 2)
return vec;
bool flag[max_num+1];
for(int i=0; i<=max_num; ++i)
flag[i] = true;
//初始化
flag[0] = false;
flag[1] = false;
int start = 2; //素数的起始位置
vec.push_back(start);
while(start <= max_num)
{
//划掉当前素数的倍数,这些数字都不可能是素数了
for(int i=(start*start); i<=max_num; i+=start)
{
flag[i] = false;
}
start = GetNextSushu(start, max_num, flag);
if(start > max_num)
break;
vec.push_back(start);
}
return vec;
}
生成100以内的素数

本文介绍了素数的定义以及两种方法:素数的判定和素数序列生成。在素数判定中,利用平方根作为上限优化了判断过程;在素数序列生成部分,提到了埃拉托斯尼特筛选法,这是一种高效生成素数序列的算法,通过排除素数倍数来找出所有小于100的素数。
1193

被折叠的 条评论
为什么被折叠?



