paizaの練習問題を解く 素数判定 Go編
こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 素数判定 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】 実装 最初は以下のように実装しました。 package main import "fmt" func main(){ var n int fmt.Scan(&n) if n == 1 { fmt.Println("NO") return } for i := 2; i < n; i++ { if n % i == 0 { fmt.Println("NO") return } } fmt.Println("YES") } (ほんとの最初はn = 1のときの考慮もなかったことは内緒) ですが当然のように実行時間オーバーしてしまいました。 残念。。 ということで解説を見ると…目から鱗な解決法がありました。 実は調べるのは Nの0.5乗(ルートN) まででいいです。 なぜかというと、 N に 1 と N 以外の約数があると仮定した場合、少なくとも 1 つは N の 0.5 乗(ルート N ) 以下の約数があることになるからです。 ということで実装を変更します。 なんと先ほどのコードに2文字追加するだけで解決できてしまいます。 package main import "fmt" func main(){ var n int fmt.Scan(&n) if n == 1 { fmt.Println("NO") return } // 条件式をi*i < nとするだけでOK for i := 2; i*i < n; i++ { if n % i == 0 { fmt.Println("NO") return } } fmt.Println("YES") } いやぁびっくりしました。確かに言われてみればという方法でした。 ...