A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 往事如风555 中级黑马   /  2015-9-22 20:23  /  468 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/*
        需求:求两个正整数的最小公倍数。
        思路:假设两个正整数分别为m、n,那么最小公倍数必定大于等于m、n中较大的那个,让这个较大的数
              除以m、n,同时可以除尽的即为最小公倍数,如果除不尽就+1,直到可以同时除尽。
*/
class MinGongBeiShu
{
        public static void main(String[] args)
        {
                int a = getMinGongBeiShu(8,6);                //测试8和6,输出结果是24
                int b = getMinGongBeiShu(10,15);        //测试10和15,输出结果是30
                System.out.println("最小公倍数是"+a);
                System.out.println("最小公倍数是"+b);
        }
       
        //以下方法是求两个正整数的最小公倍数
        public static int getMinGongBeiShu(int m,int n)
        {
                int x = (m>n)?m:n;        //x为m、n中较大的那个
                while (x%m != 0 || x%n != 0)        //如果除不尽就+1,直到可以同时除尽
                {
                        x++;                       
                }
                return x;
        }
}

9 个回复

倒序浏览
这种做法很直接,但是如果两个数都是素数,而且值都比较大的话,运算次数就比较多了了
可以先求出两者的最大公约数,用两数的乘积除以最大公约数
回复 使用道具 举报
charryxiaocai 发表于 2015-9-22 20:55
这种做法很直接,但是如果两个数都是素数,而且值都比较大的话,运算次数就比较多了了
可以先求出两者的最 ...

有道理,那样慢慢加上去一个个的验证是有点不好,你说的那种方法可以列出来一下吗?
回复 使用道具 举报
这个比较巧妙的方法,利用取余、交换····比较难想到


public static void max_min(int m, int n){
                int temp = 1;
                int yshu = 1;//约
                int bshu = m*n; //倍
                if(n<m){
                        temp = n;
                        n = m;
                        m = temp;
                }
                while(m!=0){  //两者中较小数
                        temp = n%m;  // 21n  % 14m   = 7
                        n = m;    //n = 14
                        m = temp;  //m=7  25m 31n ---6  
                }
                yshu = n;  //14
                bshu /= n;//21*14/7=42
                System.out.println(m+"和"+n+"的最大公约数为"+yshu);
                System.out.println(m+"和"+n+"的最小公倍数为"+bshu);
        }
回复 使用道具 举报
我最初想到的方法,还是有点直接:

import java.util.Scanner;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;

public class text {

        public static void main(String[] args) {
                /*
                 * 输入两个正整数m和n,求其最大公约数和最小公倍数。
                 * 最大公约数:可以约的最大数
                 * 最小公倍数:公共的倍数,最小
                 * */
                Scanner sc = new Scanner(System.in);
                System.out.println();
                int n = sc.nextInt();
                int m = sc.nextInt();
                LinkedList al = new LinkedList();
                ArrayList all = new ArrayList();
                //公倍数:公共的最小倍数
                //n  m    首先n*m   最原始的方法:  小于n的数都,能除尽的拿来
                for(int i = 1;i<=n;i++){
                        if(n%i == 0) al.addFirst(i);
                }
                for(int i = 1;i<=m;i++){
                        if(m%i == 0) all.add(i);
                }
                Iterator iter = al.iterator();
                int a = 1;
                while(iter.hasNext()){
                        a = (int) iter.next();
                        if(all.contains(a)) break;
                }
                System.out.println("最大公约数为:" + a);
                System.out.println("最小公倍数为:" + n*m/a);
                System.out.println(al);
                System.out.println(all);
        }

}
回复 使用道具 举报
/* 需求:求两个正整数的最小公倍数。*/
class A {
        public static void main(String[] args) {
                getMax(11,22);
        }
        public static void getMax(int x,int y) {
                if(x<y) {
                        int m=x;
                                x=y;
                                y=m;
                }
                for (int i=x;i<=x*y ;i++ ) {
                        while(i%x==0 && i%y==0) {
                                System.out.println("两个正整数的最小公倍数是:"+i);
                                return;
                        }
                }
        }
}
//思路:    2数的大值<=两个数的最小公倍数<=2数的积,这样的判定范围就比较小了

回复 使用道具 举报
zzy张 中级黑马 2015-9-23 00:09:22
7#
阿秋 发表于 2015-9-22 23:03
/* 需求:求两个正整数的最小公倍数。*/
class A {
        public static void main(String[] args) {

xy交换一下是什么意思?
回复 使用道具 举报
阿秋 中级黑马 2015-9-23 20:55:16
8#
zzy张 发表于 2015-9-23 00:09
xy交换一下是什么意思?

保证x为两数的大值,赋值给变量i.
回复 使用道具 举报
感觉楼主思路很好,我做的时候是判断最大值,然后用for循环一个一个除,感觉在运行方面就比你这个慢好多,而且代码还要多!
回复 使用道具 举报
楼夜雪 来自手机 中级黑马 2015-9-23 23:25:21
10#
留名,有时间来看
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马