求x,y两个数的最大公约数和最小公倍数
最大公约数
我看到这个题,想到的是穷举法,先选出两者之间最小的那个数作为上界,从这个最小值开始递减,如果x 与 y都可以整除的第一个数,就为最大公约数。代码如下:
#include <iostream>
using namespace std;
//两数的乘积等于最小公倍数与最大公约数的乘积
int main()
{
int x, y, min, i;
cin >> x >> y;
min = x;
if (x > y)
{
min = y;
}
for (i = min; i >= 1; i--)
{
if (x % i == 0 && y % i == 0)
{
break;
}
}
cout << i << endl;
return 0;
}
后来想起以前有学过一个辗转相除法(欧几里德算法),其原理为:GCD(x , y)=GCD(x , y - x), x > y,即:GCD(x , y)=GCD(y, x mod y) , x > y
#include <iostream>
using namespace std;
int main()
{
int a, b, c;
cin >> a >> b;
while(b)
{
c = a % b;
a = b;
b = c;
}
cout << a << endl;
return 0;
当然也可以把写成GCD函数
int gcd(int a,int b)
{
return b ? gcd(b , a % b) : a;
}
最小公倍数
只需要先求出最大公约数,用两个数的乘积除以最大公约数即为最小公倍数。
#include <iostream>
using namespace std;
int gcd(int a,int b)
{
return b ? gcd(b , a % b) : a;
}
int main()
{
int x, y, z, l, mul;
cin >> x >> y;
mul = x * y;
l = gcd(x, y);
z = mul / l;
cout << z << endl;
return 0;