可以使用穷举法:
int func(int x,int y)//返回x和y的最大公约数
{
int z;
x<y?z=x:z=y;
while(1)
{
if(x%z==0 && y%z==0)
return z;
z--;
}
}
效率太差。
使用辗转相除法
辗转相除法原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。
辗转相除法是利用以下性质来确定两个正整数 a 和 b 的最大公因子的:
1. 若 r 是 a ÷ b 的余数,则
gcd(a,b) = gcd(b,r)
2. a 和其倍数之最大公因子为 a。
另一种写法是:
1. a ÷ b,令r为所得余数(0≤r<b)
若 r = 0,算法结束;b 即为答案。
2. 互换:置 a←b,b←r,并返回第一步
Java语言如下:
Java语言如下:
public static int gcd(int m, int n) {
while (true) {
if ((m = m % n) == 0)
return n;
if ((n = n % m) == 0)
return m;
}
}