Java算法----遞歸求N個正數的最小公倍數

兩個或多個整數公有的倍數叫做它們的公倍數。
兩個或多個整數的公倍數裏最小的那一個叫做它們的最小公倍數。

直接貼出兩個正數的最小公倍數的求法,這是我在大學學習java的時候的想法,雖然性能不好,但還是可以實現的.
代碼如下

    /**
     * 求兩個數的最小公倍數
     * @param num1
     * @param num2
     * @return 兩個數的最小公倍數
     */
    public int minNUM(int num1, int num2) {
        if (num1 >= num2){
            //如果大數可以整除小數,則直接返回大數
            if(num1%num2 == 0) 
                return num1;
            //開始從2循環,判斷這兩個數能不能同時除以一個數
            for(int i = 2;i<num2/2+1;i++){
                //如果兩個數有公約數
                if(num1%i == 0 && num2%i == 0){
                    //提取公約數,講約過的兩個數繼續求公約數
                    return i*minNUM(num1/i,num2/i);
                }
            }
            //沒有公約數,則返回兩數積
            return num1*num2;
        }else{
            return minNUM(num2,num1);
        }
    }

上面代碼用到遞歸,遞歸我會在以後另發博文送上
當求N個正整數的最小公倍數,則可以把前N-1個數的最小公倍數看成一個數跟最後一個數求兩個數的最小公倍數,然後通過遞歸算法,講前N-1個數繼續遞歸,直至求兩個數的最小公倍數
奉上代碼:

    /**
     * 求N個正正數的最小公倍數
     * @param arr N個數的數組
     * @index 數組要分離的最後一位
     * @return N個數的最小公倍數
     */
    public int minNUMS(int[] arr,int index){
        //分離到數組的第一位,
        if(index==1){
            return arr[0];
        }
        return minNUM(minNUMS(arr,index-1),arr[index-1]);
    }

想不起來大學的時候是怎麼處理了,臨時想的,測試是可以的,就是不太好理解,上面的代碼性能上差很多,
貼出來上次在算法書上看到的求兩個數最小公倍數的方法:

      public int minSUM(int n,int m){
          if(m>n) //保證第一個數不小於第二個數
              return minSUM(m,n);
          int temp;
          int num1= n,num2=m;
          while(n % m != 0){
              temp = n % m;
              n =m;
              m =temp;
          }
          //m爲最大公約數
          return num1*num2/m;
      }
發佈了30 篇原創文章 · 獲贊 22 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章