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;
      }

猜你喜欢

转载自blog.csdn.net/qq_26555463/article/details/77448344