本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:
输入在一行中给出两个正整数M和N(≤1000)。
输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。
输入样例:
511 292
输出样例:
73 2044
经典算法题,如何求GCD
初级思路:从2开始一个个去试商,如果能整除则记录下来,直到找到最大的
- 从2开始,到最小的数为止
- 从2开始,到最小的数的 1 2 \frac{1}{2} 21为止
- 从2开始,到最小的数a, a \sqrt{a} a为止
- …
中级思路:利用辗转相除法(欧几里得算法) A ÷ B = C . . . D A \div B = C...D A÷B=C...D
- 核心思路是,gcd(A,B) == gcd(C ,D)
- 为什么上述式子相等?Wiki 上有详细证明
#include<stdio.h>
int getGCD( int a , int b ) ;
int main(void){
int M , N ;scanf("%d %d",&M,&N) ;
int GCD , LCM ;//Greatest Common Divisor;least Common Multiple
GCD = getGCD( M ,N ) ;
LCM = M * N / GCD ;
printf("%d %d",GCD,LCM) ;
return 0 ;
}
int getGCD( int a , int b )
{
int remainder ;
remainder = a % b ;
while( remainder != 0 ){
a = b ;
b = remainder ;
remainder = a % b ;
}
return b ;
}