一、
首先给出我计算最大公约数(greatest common divisor)的算法(很直观就不详细说明了):
代码如下:
public long gcd(long a,long b){
long c=Math.min(a, b);
while(true){
if(a%c==0 && b%c==0){
break;
}else{
c--;
}
}
return c;
}
这种算法很容易就想到,但是效率较低。经典的计算两个正整数的最大公约数的算法是欧几里德算法,又称辗除法。
参考百度百科:
其计算原理依赖于下面的定理(gcd(a,b) 表示 a, b 的最大公约数):
gcd(a,b) = gcd(b,a mod b) (a>b 且a mod b 不为0)
证明: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)的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证
根据这个算法编写代码,gcd(M,N) ,假设 M>=N (如果 N>M ,则循环的第一次迭代将它们互相交换)
public long gcd2(long M,long N){
while(N!=0){
long rem=M%N;
M=N;
N=rem;
}
return M;
}