今天看見乙個求給定範圍內素數個數的程式設計題目,覺得還是有些小玄機的,特此分享一下。
所有有關素數的問題首先都會涉及到乙個問題,就是判斷乙個數是不是素數,判斷乙個數是不是素數方法很簡單,根據素數的定義(素數是只能被1和它自身整除的大於1的自然數)可以很容易寫出程式出來,但是用一些小技巧的話可以將程式更加優化,提高演算法的時間效率。
素數中唯一的一位偶數就是2,其餘都是奇數,但也不是所有奇數都是素數,必須是只能被1和本身整除的奇數。自然而然我們會想到先特殊考慮當待測數等於2的時候,當待測數大於2的時候就從2到待測數本身遍歷一遍,如果不存在能整除待測數的數,那麼這個待測數就是素數。
那麼就會出現兩個問題。
第乙個問題就是,從2開始的話,會遍歷很多的偶數,但是偶數根本不需要遍歷,因為大於2的偶數不可能是素數,冗餘的遍歷增加了演算法時間複雜度;
第二個問題就是,從2一直遍歷到待測數本身也是沒必要的,我們可以縮小遍歷範圍。由數學中我們知道,如果乙個數n有兩個因數j和k,比如8=2*4,2和4就是8的兩個因數,假設j大於根號n,k也大於根號n,那麼可以得到j*k>根號n*根號n>n,所以如果n能表達成j*k,那麼j和k必然有乙個是小於根號n的,當我們遍歷2到根號n的時候只要發現待測數存在乙個不等於1和它本身的因數,那麼就可以斷定待測數不是素數,不存在小於根號n的因數的話也可以斷定待測數就是素數,所以我們可以縮小遍歷範圍,從2到根號n,從而提高演算法時間效率。
第二個問題是一定要解決的,第二個問題不解決的**是這樣的:
#include "stdafx.h"
#include "math.h"
//#include int _tmain(int argc, _tchar* argv)
if(s!=1)
printf_s("%d是乙個素數!\n",t);
} else printf_s("輸入的數不是素數!\n");
s=0;
//end=clock();
//printf_s("時間為%f\n",(end-start));
}while(1);
return 0;
}
可以發現**判斷語句較為簡潔,但是沒有解決第乙個問題,同時解決掉兩個問題的**如下:
#include "stdafx.h"
#include "math.h"
int _tmain(int argc, _tchar* argv)
} if(s!=1) printf_s("%d是乙個素數!\n",t);
} else printf_s("輸入的數不是素數!\n");
s=0;
}while(1);
return 0;
}
這種方法判斷語句雖然複雜了一點,但是從原理上講是最優化的,各種演算法空間複雜度差不多,我們可以通過計算程式執行的時間來判斷演算法時間效率,只是需要高精度的統計時間,這裡不贅述,有興趣可以補充這一議題。 python判斷素數優化 求素數優化演算法
在比賽或者工作時,有時候會經常要求我們程式設計求素數,但是我們自己寫出來的時間複雜度太高,所以我在這裡做個總結。先貼上最終函式,該段 在開啟最大 優化時,可以直接內嵌進呼叫程式中,使得速度更加極致。c語言 對 n 進行素數判斷 inline static int is prime int n int...
關於質數判斷的討論
同學甲 shuzi int input 請輸入乙個數 sum 0 a 0 while sum shuzi sum 1 if shuzi sum 0 a a 1 print a if a 2 and a 3 print 質數為 shuzi else print 不是質數 同學乙sum int inpu...
判斷素數的方法
素數的定義 乙個大於1的自然數,除了1和它本身外,不能被其他自然數整除的素數叫素數。單獨判讀輸入的數n是不是1和2,再從2到n 1判斷是否存在能被2整除的數,如果有就是素數,沒有就不是素數。核心 如下 include func int n return1 intmain 其中優化的乙個方法就是對於乙...