素数判决和素数序列生成
2017-07-27 10:11
190 查看
前言
质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数。1. 素数的判定
方法1bool 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以内的素数
相关文章推荐
- 生成素数序列----埃拉托斯特尼筛法
- poj3518生成素数表+二分查找
- PowerDesigner(八)-面向对象模型(用例图,序列图,类图,生成Java源代码及Java源代码生成类图)
- 生成素数表
- Oracle sql技巧--生成序列
- vim学习高级技巧之序列的生成方法详解
- oracle的序列使用,创建、表中调用、主键自动生成
- 10: 判决素数个数
- java 生成一个永不重复的数字序列
- 最效率的素数序列数组
- 使用线性同余法生成伪随机数/序列(C++实现)
- 实验三:实现一个大素数生成算法
- 用伪随机数生成器Random生成随机数序列
- matlab中用图像序列生成视频
- 根据日期自动生成序列编号
- 使用Excel2010生成等差序列
- np.random.permutation生成随机序列
- PowerDesigner(八)-面向对象模型(用例图,序列图,类图,生成Java源代码及Java源代码生成类图)
- oracle的序列使用,创建、表中调用、主键自动生成
- M序列的生成