求素数的方法汇总

// 按字典序输出2 到 n 的素数

// 效率由低到高

// 方法6 目前还不会 以后再加上


#include <iostream>

#include <cmath>

using namespace std;


void is_Prime_1(int n);//试除法

void is_Prime_2(int n);//试除法

void is_Prime_3(int n);//试除法

void is_Prime_4(int n);//试除法

void is_Prime_5(int n);//试除法

void is_Prime_6(int n);//试除法


void is_Prime_7(int n);//筛选法

void is_Prime_8(int n);//打表法


int main(int argc, const char * argv[])

{

    int n;

    cin >> n;

    is_Prime_1(n);

    is_Prime_2(n);

    is_Prime_3(n);

    is_Prime_4(n);

    is_Prime_5(n);

    is_Prime_6(n);

    is_Prime_7(n);

    is_Prime_8(n);

    return 0;

}


void is_Prime_1(int n)

{

    for(int j = 2; j <= n; j++)

    {

        int i = 2;

        for(; i <= j - 1; i++)

        {

            if(j % i == 0)

                break;

        }

        if(i > j - 1)

            cout << j << " ";

    }

    cout << endl;

}


void is_Prime_2(int n)

{

    for(int j = 2; j <= n; j++)

    {

        int i = 2;

        for(; i <= j >> 1; i++)

        {

            if(j % i == 0)

                break;

        }

        if(i > j >> 1)

            cout << j << " ";

    }

    cout << endl;

}


void is_Prime_3(int n)

{

    cout << "2 ";

    for(int j = 3; j <= n; j += 2)

    {

        int i = 3;

        for(; i <= j >> 1; i++)  // >> 位运算 相当于 2 效率更高

        {

            if(j % i == 0)

                break;

        }

        if(i > j >> 1)

            cout << j << " ";

    }

    cout << endl;

}


void is_Prime_4(int n)

{

    for(int j = 2; j <= n; j++)

    {

        int i = 2;

        for(; i <= sqrt(j); i++)

        {

            if(j % i == 0)

                break;

        }

        if(i > sqrt(j))

            cout << j << " ";

    }

    cout << endl;

}


void is_Prime_5(int n)

{

    cout << "2 ";

    for(int j = 3; j <= n; j += 2)

    {

        int i = 3;

        for(; i <= sqrt(j); i++)

        {

            if(j % i == 0)

                break;

        }

        if(i > sqrt(j))

            cout << j << " ";

    }

    cout << endl;

}


void is_Prime_6(int n)//空间换时间

{

    cout << "空间换时间" << endl;

//    尝试从 3 √x 的所有奇数,还是有些浪费。

//    比如要判断101是否质数,101的根号取整后是10,那么,按照境界4,需要尝试的奇数分别是:3579。但是你发现没有,对9的尝试是多余的。不能被3整除,必然不能被9整除......顺着这个思路走下去,就会发现:其实,只要尝试小于√x 的质数即可。而这些质数,恰好前面已经算出来了

}


void is_Prime_7(int n)//筛选法

{

    bool prime[10000];

    fill(prime, prime + 10000, true);

    for(int i = 3; i <= n; i++)

    {

        if(i % 2 == 0)

            prime[i] = false;

    }

    for(int i = 3; i <= sqrt(n); i += 2)

    {

        if(prime[i])

        {

            for(int j = i + i; j <= n; j += i)

                prime[j] = false;

        }

    }

    for(int i = 2; i <= n; i++)

    {

        if(prime[i])

            cout << i << " ";

    }

    cout << endl;

}

void is_Prime_8(int n)

{

    cout << "打表" << endl;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值