最大公约数和最小公倍数

来源:互联网 发布:淘宝卖家怎么去谈快递 编辑:程序博客网 时间:2024/06/06 17:38
描述
小明被一个问题给难住了,现在需要你帮帮忙。问题是:给出两个正整数,求出它们的最大公约数和最小公倍数。
输入
第一行输入一个整数n(0<n<=10000),表示有n组测试数据;
随后的n行输入两个整数i,j(0<i,j<=32767)。
输出
输出每组测试数据的最大公约数和最小公倍数
样例输入
3
6 6
12 11
33 22
样例输出
6 6
1 132

11 66

方法一:自己纯(蠢)写,好笨!

import java.io.*;import java.util.Scanner;public class Main { public static void main(String[] args) throws IOException {  Scanner in=new Scanner(System.in);int k=in.nextInt();        while((int) k-->0){            int m=in.nextInt();            int n=in.nextInt();            int maxDiv=1,minMul=1;            for (int i = 1; i<=Math.min(m, n); i++) {if(m%n==0){maxDiv=n;break;}if(n%m==0){maxDiv=m;break;}if(n%i==0&&m%i==0){if(maxDiv<i)maxDiv=i;}}System.out.print(maxDiv+" ");for (int i = Math.max(m, n); i<=m*n; i++) {if(m%n==0){minMul=m;break;}if(n%m==0){minMul=n;break;}if(i%m==0&&i%n==0){minMul=i;    break;    }}System.out.print(minMul);        System.out.println();        } }} 
反思:如果两个数本身可以相除,那么被除数就是最小公倍数,除数就是最大公约数,所以先进行一个小小的判断,因为公约数求最大的,所以要一直求解到两个数里面最小的那一个,而公倍数要最小的,所以只要从两个数里面最大的开始找起,知道找到一个即满足!

方法j二:其实求出最大公约数之后,直接m*n/c即可,这里我借鉴别人的辗转相除法来求解最大公约数

package MainTest;import java.util.Scanner;public class Main { //辗转相除法    static int zxc(int m,int n){      if(m%n==0)    return n;     else       return zxc(n,m%n);    }public static void main(String[] args) {  Scanner in=new Scanner(System.in);int k=in.nextInt();        while((int) k-->0){            int m=in.nextInt();            int n=in.nextInt();            int maxDiv=1,minMul=1;            maxDiv=zxc(m,n);System.out.print(maxDiv+" ");minMul=m*n/maxDiv;System.out.print(minMul);        System.out.println();        } }} 

​来源

设两数为a、b(a>b),求a和b最大公约数(a,b)的步骤如下:用a除以b,得a÷b=q......r1(0≤r1)。若r1=0,则(a,b)=b;若r1≠0,则再用b除以r1,得b÷r1=q......r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r1除以r2,……如此下去,直到能整除为止。其最后一个非零除数即为(a,b)。

折叠编辑本段原理

设两数为a、b(b<a),用gcd(a,b)表示a,b的最大公约数,r=a mod b 为a除以b以后的余数,k为a除以b的商,即a÷b=k.......r。辗转相除法即是要证明gcd(a,b)=gcd(b,r)。

第一步:令c=gcd(a,b),则设a=mc,b=nc

第二步:根据前提可知r =a-kb=mc-knc=(m-kn)c

第三步:根据第二步结果可知c也是r的因数

第四步:可以断定m-kn与n互质【否则,可设m-kn=xd,n=yd,(d>1),则m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)cd,b=nc=ycd,故a与b最大公约数成为cd,而非c,与前面结论矛盾】

从而可知gcd(b,r)=c,继而gcd(a,b)=gcd(b,r)。

证毕。

折叠算法

自然语言描述


输出b

辗转相除法是利用以下性质来确定两个正整数 a 和 b 的最大公因子的:

1. 若 r 是 a ÷ b 的余数,则

gcd(a,b) = gcd(b,r)

2. a 和其倍数之最大公因子为 b。

另一种写法是:

1. a ÷ b,令r为所得余数(0≤r<b)

若 r = 0,算法结束;b 即为答案。

2. 互换:置 a←b,b←r,并返回第