/**
* 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 在循环中,只要除数不等于0,用较大数除以较小的数,
* 将小的一个数作为下一轮循环的大数,取得的余数作为下一轮循环的较小的数,
* 如此循环直到较小的数的值为0,返回较大的数,此数即为最大公约数,最小公倍数为两数之积除以最大公约数。
* 时间:2015年7月28日09:00:05
* 文件:lianxi06.java
* 作者:cutter_point
*/
package bishi.zuixin50.t2015728;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
public class lianxi06
{
//我们用辗转相除法来求最大公约数
public static int GreatestCommonDivisor(int m, int n)
{
//首先我们假定一个余数是最大公约数
int chushu = m % n; //两数的余数,要么就是最大公约数,要么就是一个除数
int beichu = n; //这个是我们接下来的被除数
while(chushu != 0)
{
//当余数不为0的时候,说明还没有到最大公约数
int temp = chushu; //我们把除数备份
chushu = beichu % chushu; //求得新的除数
beichu = temp; //吧原来的除数作为新的被除数
}
//指导除数为0的时候说明到了最后的结果,最大公约数就是此时的被除数
return beichu;
}
//最大公倍数=两数的积/最大公约数
public static int LeaseCommonMultiple(int m, int n)
{
//求得最大公约数
int greatestCommonDivisor = lianxi06.GreatestCommonDivisor(m, n);
return (m * n) / greatestCommonDivisor;
}
public static void main(String[] args) throws Exception
{
//System.out.println(System.getProperty("java.class.path"));
//System.out.println(new lianxi06().getClass().getProtectionDomain().getCodeSource().getLocation());
//我们从文件中读取相应的数据
FileInputStream infile = new FileInputStream(new File("source/zuixin50/lianxi06input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(infile, "utf-8"));
//我们把结果输出到相应的文件
FileOutputStream fos = new FileOutputStream(new File("source/zuixin50/lianxi06output.txt"));
//读取一行数据
String line = "";
while( ( line = br.readLine() ) != null )
{
//每行数据我们用“\t”隔开
String a[] = line.split("\t");
int m, n;
//吧这两个数转化为整数
m = Integer.parseInt(a[0]);
n = Integer.parseInt(a[1]);
String out = m + " 和 " + n + "的最大公约数是:" + lianxi06.GreatestCommonDivisor(m, n) + "\n"
+ "\t最小公倍数是:" + lianxi06.LeaseCommonMultiple(m, n) + "\n";
System.out.println(out);
fos.write(out.getBytes());
}
//关闭流
fos.close();
br.close();
infile.close();
}
}