【C++】三種簡單方式計算N以內所有的素數
阿新 • • 發佈:2020-12-11
【C++】三種簡單方式計算N以內所有的素數
說明
-
sushu1(…)函式:
粗暴遍歷演算法,判斷i是不是素數時,從2到i取餘,餘數為0只有兩個的為素數,count++。 -
sushu2(…)函式:
對i遍歷取餘是從2到(i-1),只要出現餘數為0直接判斷為素數,count++。
第一步對2取餘直接篩出除了2以外的所有偶數(不是素數),複雜度少一半,發現餘數為0直接退出也是對第一種演算法的優化。 -
shushu3(…)函式:
對i取餘的遍歷範圍從2到(i-1)變為2到(N的平方根),效率提高很明顯,原理不多贅述。種更好理解這種的演算法,可以是遍歷範圍從2到i/2。 -
用到了函式指標作為函式引數,用來在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