こんにちは、ナナオです。
前回に引き続き競プロを実施していきたいと思います。
今回の問題は以下です。
素数判定 | レベルアップ問題集 | プログラミング学習サイト【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")
}
いやぁびっくりしました。確かに言われてみればという方法でした。
ということで今回はこれで👍