您的位置:首页 > 其它

最大公约数和最小公倍数

2017-07-31 08:02 246 查看
描述
小明被一个问题给难住了,现在需要你帮帮忙。问题是:给出两个正整数,求出它们的最大公约数和最小公倍数。
输入
第一行输入一个整数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 jav
4000
a.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,并返回第
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: