こんにちは、ナナオです。
前回に引き続き競プロを実施していきたいと思います。
今回の問題は以下です。
最大公約数 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】
実装
まずは愚直に以下のように実装しました。
package main
import "fmt"
func main(){
var a, b int
fmt.Scan(&a, &b)
min := 0
if a < b {
min = a
} else {
min = b
}
for i := min; i > 0; i++ {
if a % i == 0 && b % i == 0 {
fmt.Println(i)
return
}
}
}
ですが、これだとタイムオーバーになってしまいました。
ということで修正します。
ユークリッドの互除法 を用います。 これは 「AとBの最大公約数は、BとA%Bの公約数と等しい」 という性質を利用して最大公約数を求める方法です。 この方法を用いると計算量がO(log(max(A, B)))となります。
ユークリッドの互除法は再帰を使って簡単に実装できます。
package main
import "fmt"
func gcd(a, b int) int {
if b == 0 {
return a
}
return gcd(b, a%b)
}
func main(){
var a, b int
fmt.Scan(&a, &b)
fmt.Println(gcd(a, b))
}
うーん、びっくりするくらい簡単に実装できましたね。。
ただすぐわすれちゃいそう…
というわけで今回はこれで👍