Java求两个数的最大公约数及最小公倍数、求多个数的最大公约数及最小公倍数

火山日常啰嗦
今天参加腾讯笔试,做编程题时在最小公倍数、最大公约数这些这么简单的知识点上卡壳了,自信心受到强烈的打击,下来后猛复习了这方面的相关编程知识。

有以下几个关键点:
1、任意正整数的最大公约数、最小公倍数都是它本身。
2、求两个数的最大公约数(递归法、相减法、辗转相除法)
3、求两个数的最小公倍数,两个数的最小公倍数与它们的最大公约数之间存在如下关系:
某两个数a,b的最小公倍数=(a*b)/a与b的最大公约数
4、求多个数的最大公约数可以拆解成求两个数的最大公约数的过程
5、求多个数的最小公倍数可以拆解成求两个数的最小公倍数的过程

详细解析都在以下代码中:

public class Main {

//    递归法
    public  static int MaxCommonNum(int left , int right){
        /**
         * 我始终让left>right,这不是硬性要求哈,只是我个人的编程习惯
         */
        if(left<right){
            int temp = left;
            left = right;
            right = temp;
        }
        if((left%2!=0 || right%2!=0)&&(left%right!=0)) return 1;
        else if((left%2!=0 || right%2!=0)&&(left%right==0))  return right;
        else return 2*MaxCommonNum(left/2,right/2);
    }

//    相减法
    /**
     * @param left
     * @param right
     * @return
     * 1 若a>b,则a-=b
     * 2 若a<b,则b-=a
     * 3 若a==b,则a(或者b)就是所求的最大公约数
     * 4 若a!=b,则回去执行1、2步骤
     */
    public static int MaxCommonNum1(int left , int right){
        if(left==right) return left;
        if(left>right) left-=right;
        else right-=left;
        return MaxCommonNum1(left,right);
    }

//    辗转相除法
    /**
     * @param left
     * @param right
     * @return
     * 若要用left对right取模,那么要保证left>=right(反之亦然)
     * 1 若left%right==0,则right就是所求的最大公约数
     * 2 若left%right!=0,则将right的值赋给left,将left%riht的值赋给right,即left=right,right=left%right,然后再取模,判断余数是否为0
     * 3 重复这些步骤,直到left%right==0,则right就是所求的最大公约数
     *
     * */
    public static int MaxCommonNum2(int left , int right){
        if(left<right){
            int temp = left;
            left = right;
            right = temp;
        }
        if(left%right==0) return right;
        else return MaxCommonNum2(right,left%right);
    }

//    求多个数的最大公约数,借助求两个数的最大公约数的方法来求
    /**
     *
     * @param arr
     * @return
     * 求多个数的最大公约数,那么可以传入一个数组int arr[]
     * 1 取arr[0]赋给temp(某个正整数的最大公约数是它本身),然后通过求两个数的最大公约数的方法先求出temp与arr[1]的最大公约数,将结果赋给temp,则temp表示arr[0]与arr[1]的最大公约数
     * 2 然后再求temp与arr[2]的最大公约数,将结果赋给temp
     * 3 循环直到temp与剩余的每个数都求过最大公约数了,那么最后所求的那个就是这组数的最大公约数了
     *
     */
    public static int MaxCommonNumFromMultiNumbers(int arr[]){
        int temp = arr[0];
        for(int i=1;i<arr.length;i++){
            temp = MaxCommonNum(temp,arr[i]);
        }
        return temp;
    }

//    求两个数的最小公倍数

    /**
     *
     * @param left,right
     * 两个数a,b的最小公倍数=(a*b)/a与b的最大公约数
     *
     */
    public static int MinCommonNum(int left,int right){
        return left*right/MaxCommonNum(left,right);
    }

//    求多个数的最小公倍数

    /**
     *
     * @param arr
     * @return
     * 求多个数的最小公倍数跟求多个数的最大公约数的方法一样
     */
    public static int MinCommonNumFromNumbers(int arr[]){
        int temp = arr[0];
        for(int i=1;i<arr.length;i++){
            temp = MinCommonNum(temp,arr[i]);
        }
        return temp;
    }

    public static void main(String[] args) {

//        求两个数的最大公约数,有三种方法:
//        1、递归法
//        2、相减法
//        3、辗转相除法

//        求多个数的最大公约数,借助求两个数的最大公约数的方法来求

//        递归法
        System.out.println(MaxCommonNum(3,5));
        System.out.println(MaxCommonNum(12,8));

//        相减法
        System.out.println(MaxCommonNum1(3,5));
        System.out.println(MaxCommonNum1(12,8));

//        辗转相除法
        System.out.println(MaxCommonNum2(3,5));
        System.out.println(MaxCommonNum2(12,8));

//        求多个数的最大公约数
        int[] arr = {1,2,3,4,5,6};
        System.out.println(MaxCommonNumFromMultiNumbers(arr));

//        求两个数的最小公倍数
        System.out.println(MinCommonNum(3,5));
        System.out.println(MinCommonNum(12,8));

//        求多个数的最小公倍数
        int[] array = {4,5,6};
        int[] array1 = {1,2,3,4,5,6};
        System.out.println(MinCommonNumFromNumbers(array));
        System.out.println(MinCommonNumFromNumbers(array1));
   }
}

有误之处望请指出,望共同进步。感谢!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容