高效率素数筛法 代码实现,内含干货

这篇文章主要为大家介绍一个算法,素数筛法。

想必小伙伴们大家最常用的算法就是很常规的素数算法。在下面给出代码。

//C++实现,如果有人不会C实现的版本请联系我,我写完给你看
//如果有小伙伴不理解代码请留言

/// 以下是求单个素数版本

//功能:输入num判断num是否为素数
#include<iostream>
#include<math.h>      //这个是用于后面的sqrt()函数
using namespace std;

///  单个素数怎么判定的算法,如果正确就返回1
int IsPrime(int num){
    int i;
    for(i=2;i<sqrt(num);i++)    //数学上证明了只需要到sqrt就可以了
    {
        if(num%i==0){
            return 0;
        }
    }
    return 1;
}
void main()
{   
    int num;
    cin>>num;              //cin相当于C语言中的scanf
    if(IsPrime(num)){
        cout<<"该数是素数"<<endl;     //cout相当于C语言中的printf
    }
    else
        cout<<"该数不是素数"<<endl;
}

/ 以下是求一段区间的素数代码

//功能:输出0到N-1之间的素数
#include <iostream>
using namespace std;
#define N 100
int IsPrime(int num){
    int i;
    for(i=2;i<sqrt(num);i++)    //数学上证明了只需要到sqrt就可以了
    {
        if(num%i==0){
            return 0;
        }
    }
    return 1;
}
void main()
{
    int i;
    for(i=0;i<N;i++){
        if(IsPrime(i)){
            cout<<i<<"是素数"<<" "<<endl;   //输出素数
            // 如果上一行加入一个count能够计算0到N-1的素数个数
        }
    }
}

下面是高效率的素数筛法

//  思路:1,在0到N-1  之间设置bool数组,bool数组 每一个元素放着正确或者是错误的判断,你可以认为放着的要么是1 ,要么是 0,;1代表正确true,0代表错误 false。
        2,在0到N做第一次判断,如果该数不为偶数,则bool数组该位置放true,为偶数就为false
        3,找到第二步中true的矩阵,他们的倍数肯定不是素数,因此置为false;
        4,对0到N-1做一次遍历,放true的矩阵的下标值就是素数.

代码功能:
    找到0到N-1之间的素数并输出,高效率版本
#include <iostream>
#include <math.h>
using namespace std;
#define N  100
bool  matrix[N];
void main()
{
    for(int i=3;i<N;i++){         //对应的第二步
        if(i%2){
            matrix[i] =true;
        }
        else
            matrix[i] =false;   
    }
    for(i=3;i<N;i++){                //对应的第三步
        if(matrix[i]){
            for(int j=i*2;j<N;j+=i){    
                                //找到true矩阵倍数并置false
                matrix[j] = false;
            }
        }   
    }
    for(i=3;i<N;i++){
        if(matrix[i]==true){
            cout<<matrix[i]<<" ";
        }
    }
}

总结:以上就是代码。在上面代码宏定义中的N
如果N不够大,两个算法是没有多大区别的,但是!如果N到了1000000的级别,普通素数筛法会花很久的时间,而素数筛法实现的数据只需要花很短的时间就能跑出结果,这是相当重要的!
附上算跑程序时间的源码:

#include <iostream>
#include <time.h>    //算时间的函数在这个头文件里面
#include <math.h>
using namespace std;
#define N  100
bool  matrix[N];
void main()
{   
    clock_t start,end;
    start =clock();
    for(int i=3;i<N;i++){         //对应的第二步
        if(i%2){
            matrix[i] =true;
        }
        else
            matrix[i] =false;   
    }
    for(i=3;i<N;i++){                //对应的第三步
        if(matrix[i]){
            for(int j=i*2;j<N;j+=i){    
                                //找到true矩阵倍数并置false
                matrix[j] = false;
            }
        }   
    }
    for(i=3;i<N;i++){
        if(matrix[i]==true){
            cout<<matrix[i]<<" ";
        }
    }
    end = clock();
    cout<<"跑程序花了"<<end-start<<"毫秒"<<endl;
}

小技巧:
如何粘贴CSDN的代码并去掉行号加小数点?
1,下载notepad++软件,拷贝CSDN的代码进去。
2,按住alt键就可以进行选中竖直方向的数字加小数点 ,删除即可。

                                                 seen
                                                 2015-08-07
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值