高效率素數篩法 代碼實現,內含干貨


這篇文章主要為大家介紹一個算法,素數篩法。

想必小伙伴們大家最常用的算法就是很常規的素數算法。在下面給出代碼。

//////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

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com