java 计算最小公倍数的问题

来源:百度知道 编辑:UC知道 时间:2024/06/03 18:35:36
import java.util.Scanner;
class A{
int f(int m,int n){
if(m*n<0)
{ System.out.println("有负数,程序退出");
System.exit(0);
}
if(m<n)
{ int temp=m;
m=n;
n=temp;
}
int a=m,b=n;
int r=m%n;
while(r!=0)
{ m=n;
n=r;
r=m%n;
}
return n;
}
}
其中
while(r!=0)
{ m=n;
n=r;
r=m%n;
}
这一段是什么意思,怎么实现的啊
请哪位大虾能具体的说明一下,小弟是个菜鸟,刚开始学

汗,这是欧几里得算法求最大公约数..

int r=m%n;
while(r!=0)
{ m=n;
n=r;
r=m%n;
}

这是欧几里得算法的实现...

欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:
定理:gcd(a,b) = gcd(b,a mod b)
证明:a可以表示成a = kb + r,则r = a mod b
假设d是a,b的一个公约数,则有
d|a, d|b,而r = a - kb,因此d|r
因此d是(b,a mod b)的公约数
假设d 是(b,a mod b)的公约数,则
d | b , d |r ,但是a = kb +r
因此d也是(a,b)的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证

举两个例子,比如拿8和12用这个循环试一下就会发现确实是可以的。这也算是计算最小公倍数的一个算法吧。记住就行了,是前人总结的。

反复迭代呗。