1. 程式人生 > 其它 >【C++】三種簡單方式計算N以內所有的素數

【C++】三種簡單方式計算N以內所有的素數

技術標籤:C++程式設計例項c++

【C++】三種簡單方式計算N以內所有的素數

說明

  1. sushu1(…)函式:
    粗暴遍歷演算法,判斷i是不是素數時,從2到i取餘,餘數為0只有兩個的為素數,count++。

  2. sushu2(…)函式:
    對i遍歷取餘是從2到(i-1),只要出現餘數為0直接判斷為素數,count++。
    第一步對2取餘直接篩出除了2以外的所有偶數(不是素數),複雜度少一半,發現餘數為0直接退出也是對第一種演算法的優化。

  3. shushu3(…)函式:
    對i取餘的遍歷範圍從2到(i-1)變為2到(N的平方根),效率提高很明顯,原理不多贅述。種更好理解這種的演算法,可以是遍歷範圍從2到i/2。

  4. 用到了函式指標作為函式引數,用來在test()函式內計算程式碼執行時間。

程式碼

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <time.h>
#include <cmath>

#ifndef _CLOCK_T_DEFINED
typedef long clock_t;
#define _CLOCK_T_DEFINED
#endif
#define CLOCKS_PER_SEC ((clock_t)1000)

using namespace std;
//統計N以內的所有素數 bool isPrime1(int n)//暴力演算法,時間複雜度O(n) { if(n < 2) return false; int count = 0; for(int i = 1; i <= n; i++) if(n%i == 0) count++; if(count == 2) return true; else return false; } int sushu1(int N)//17402ms { int count = 0; for(int i = 1; i <= N ;
i++) { if(isPrime1(i)) count++; } return count; } bool isPrime2(int n)//判斷出第三個因數後直接退出 { if(n < 2) return false; if(n == 2) return true; for(int i = 2; i < n; i++) { if(n%i == 0) return false; } return true; } int sushu2(int N)//1890ms { int count = 0; if(N > 2) count = 1; for(int i = 1; i <= N ; i+=2) { if(isPrime2(i)) { count++; } } return count; } bool isPrime3(int n) { if(n < 2) return false; if(n == 2 || n == 3) return true; if(n == 4) return false; for(int i = 2; i*i <= n; i++) { if(n%i == 0) return false; } return true; } int sushu3(int N)//15ms { int count = 0; for(int i = 2; i <= N ; i++) { if(isPrime3(i)) { count++; } } return count; } typedef int (* SUSHU)(int);//函式指標型別的定義,可以理解為函式(指標)模板 void test(SUSHU S, int n) { clock_t start, finish; start = clock(); cout << S(n) << endl; finish = clock(); unsigned long duration = (double)(finish - start); printf( "%ld ms\n", duration); } int main() { int N = 100000; cout << "test1:" << endl; test(&sushu1, N); cout << "test2:" << endl; test(&sushu2, N); cout << "test3:" << endl; test(&sushu3, N); return 0; }

學習記錄筆記,可評論區討論,佛系看訊息,看見會回覆QAQ