20億以下の正の整数a,bを入力。最大公約数と、最小公倍数を出力。ただし、最小公倍数は20億を超えない。
a(整数)
b(整数)
最大公約数(整数)
最小公倍数(整数)
500000000
300000000
100000000
1500000000
典型的なアルゴリズム問題です。最大公約数(GCD)を求めるにはユークリッドの互除法をもちいます。
a | b | c | 式 |
36 | 14 | 10 | 36 % 14 = 10 |
14 | 10 | 4 | 14 % 10 = 4 |
10 | 4 | 2 | 10 % 4 = 2 |
4 | 2 | 0 | 4 % 2 = 0 |
2 | 0 | 終わり |
引き算でする方法もありますが、こちらの方が数の差が大きいときの収束が早いです。でも、演算時間的には「div」は時間がかかりますけど(どうでも良いアセンブリネタでした)。
最小公倍数は、「どちらかを最大公約数で割ってもう一方と掛ける」と出ます。
#include <stdio.h> int GCD(int m,int n){ if(n==0){ return m; }else{ return GCD(n,m%n); } } int main(){ int m,n,gcd; scanf("%d\n%d",&m,&n); gcd= GCD(m,n); printf("%d\n%d",gcd,m/gcd*n); return 0; }
よくある問題です。「エラトステネスのふるい」なみによく出ます。覚えておきましょう。