题目描述:给定两个正整数m,n,求m,n的最大公约数与最小公倍数
greatest common divisor 最大公约数 (gcd)
least common multiple 最小公倍数 (lcm)
输入描述:两个正整数m,n
输出描述:两个正整数,分别为最大公约数与最小公倍数
辗转相除法(一)
#include <stdio.h>
unsigned long long gcd(unsigned long long m, unsigned long long n)
{
// 最大公约数
return n ? gcd(n, m % n) : m;
}
unsigned long long lcm(unsigned long long m, unsigned long long n)
{
// 求最小公倍数
return m * n / gcd(m, n);
}
int main()
{
unsigned long long m, n;
scanf("%llu %llu", &m, &n);
printf("%llu\n", lcm(m, n));
printf("%11u\n", gcd(m, n));
}
先确定精度,使用判断语句求出最大公约数,然后利用两者关系直接输出。
辗转相除法(二)
#include<stdio.h>
int main()
{
int m , n , temp;
scanf("%d %d",&m,&n);
int k = m*n;
while (m !=0 && n !=0)
{
temp = m % n;
m = n;
n = temp;
}
printf("gcd = %d\n",m);
printf("lcm = %d\n",k/m);
}
也叫欧几里得算法,以两数相除取余,然后取较小两数以较大者向较小者取余,如此循环,直至最后余数为0时,循环结束。
更相减损术
#include<stdio.h>
int main()
{
int m , n , temp;
scanf("%d %d",&m,&n);
int k = m*n;
while (m * n !=0 && m != n)
{
if(m>n)
{
m = m -n;
}
else
{
n = n - m;
}
}
printf("gcd = %d\n",m);
printf("lcm = %d\n",k/m);
}
更相减损术是由张苍,耿寿昌在《九章算术》中提出来的,即“可半者半之,不可半者,副置分母,子之数,以少减多,更相减损,求其等也。以等数约之。”翻译过来便是首先给定两个正整数,使其不全为偶数。然后,以较大者减较小的数,将差与两数比较,以最小两数中较大者减较小者,直至所得的减数和差相等为止。即得最小公约数。