判斷質數 素數 我知道的最快的方法

2021-08-11 15:14:24 字數 738 閱讀 9936

標準版:大部分人都知道的比較快的方法:判斷從2到sqrt(n)是否存在其約數,時間複雜度o(sqrt(n))

高配版:判斷2之後,就可以判斷從3到sqrt(n)之間的奇數了,無需再判斷之間的偶數,時間複雜度o(sqrt(n)/2)

尊享版:

首先看乙個關於質數分布的規律:大於等於5的質數一定和6的倍數相鄰。例如5和7,11和13,17和19等等;

證明:令x≥1,將大於等於5的自然數表示如下:

··· 6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1 ···

可以看到,不和6的倍數相鄰的數為6x+2,6x+3,6x+4,由於2(3x+1),3(2x+1),2(3x+2),所以它們一定不是素數,再除去6x本身,顯然,素數要出現只可能出現在6x的相鄰兩側。因此在5到sqrt(n)中每6個數只判斷2個,時間複雜度o(sqrt(n)/3)。

在高配版和尊享版中,都是乙個剪枝的思想,高配版中裁剪了不必要的偶數,尊享版中裁剪了不和6的倍數相鄰的數,雖然都沒有降低時間複雜度的階數,但都一定程度上加快了判斷的速度。

在此給出尊享版c++**:

#include #include using namespace std;

int isprime(int n)

return 1;

} int main()

{ int flag;

flag=isprime(37);

cout

求質數 素數 的方法

質數是數學重要的一環,所謂質數,就是除了1和它本身外不存在任何因子的數。以下整理了一下c語言中質數的求法。問題 輸入乙個正整數n n 2 求不大於n的全部質數 方法一 迴圈法 思路 判斷乙個數n是不是質數,可以用2到 n之間的所有整數去除n,如果都不能整除,那麼n是質數。設計迴圈巢狀時盡量跳過一些不...

C 求質數(素數)判斷1000以內的素數

定義 素數只能被1和它自身整除的數,1不是素數 2是最小的素數 思路 求某個數n是不是素數?用for迴圈讓n依次除以 從2 n 1 之間的數,如果能被整除,則n不是素數,反之則是。bool flag 宣告乙個bool值用來判斷是否是素數 for int i 2 i 1000 i 迴圈 1000以內的...

ruby 判斷質數 認識素數 維持素數的Ruby類

ruby 判斷質數 質數是只能由其自身和一 1 除的數。ruby使使用prime類訪問任意範圍內的質數變得很方便。此類表示所有質數的集合。ruby還提供了幾種訪問此處值的方法。要使用素類,請按以下步驟在文件中 要求 它 require prime 要返回一定範圍內所有素數的陣列,可以將prime類與...