1. 程式人生 > >遞迴求最大素因數(java)

遞迴求最大素因數(java)

  • 可能經常進群會問這個群號的最大素因數是多少,或者演算法題中也會遇到。今天就寫一下求最大質因數的模板。

  • 首先分析,怎麼求一個數的最大素因數。首先,我們以前求過最大因數,求最大因數的最暴力為2—n-1暴力查詢,但是這樣太超時了,後來發現在根號n前或者後某個區域查詢就行了。因為找某個因數時候。n=a* b;a<=根號n;b>=根號n;所以只需查詢到最小的因數就可以通過除法找到最大的因數。這只是查詢因數的一個思路。

  • 至於什麼是素因數呢。那麼這個數肯定滿足兩個條件:1為質數。2:為n的因數。那麼我們如何從眾多n的因數中找到最大的那個素因數呢?

  • 舉個例子

    • 對於8=24=2(2*2);那麼8的最大素因數是2;
    • 對於20=210=2(2*5)那麼20的最大素因數是5;
  • 可以發現這個查詢就是一個遞迴的過程。對於某個n,查詢的最大素因數就是他的最大因數和最小因數的兩個數的最大質因數。在往下呼叫的過程中,如果某個數是質數那麼就不進行往下遞迴,(當然也可以進行剪枝優化,比如設定一個引數為已經找到素因數的最大值,當數值小於這個數就不進行遞迴減小程式的運算量,但是一般主要的迴圈到根號n不會超時)
    下面附上程式碼:

private static int getmax(int a) {
		for(int i=
2;i*i<a;i++) { if(a%i==0) { return getmax(a/i)>getmax(i)?getmax(a/i):getmax(i); } } return a;//如果找不到因數他自己就是最大素因數 }