素数判决和素数序列生成

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

前言

质数又称素数。一个大于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以内的素数





评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值