ALDS1_1_C 素数をC++で解いてみた[AIZU ONLINE JUDGE]

AIZU ONLINE JUDGE

こんにちは! mnbd(@mnbbbbbd)です。

AIZU ONLINE JUDGEの「ALDS1_1_C 素数」を解いてみましたので、その回答と解説をご紹介いたします。

プログラミング初心者なので、もっといい回答があるに違いありません。

あくまでも「動作はする」サンプルとしてご覧ください。

問題文

約数が 1 とその数自身だけであるような自然数を素数と言います。例えば、最初の8 つの素数は2, 3, 5, 7, 11, 13, 17, 19 となります。1 は素数ではありません。

n 個の整数を読み込み、それらに含まれる素数の数を出力するプログラムを作成してください。

入力
入力に含まれる素数の数を1行に出力してください。

出力
入力に含まれる素数の数を1行に出力してください。

https://onlinejudge.u-aizu.ac.jp/courses/lesson/1/ALDS1/1/ALDS1_1_C

解答

#include <bits/stdc++.h>
using namespace std;

bool is_prime1(int x) {
    if(x <= 1) {
        return false;
    }
    for(int i = 2; i < x - 1; i++) {
        if(x % i == 0) {
            return false;
        }
    }
    return true;
}

bool is_prime2(int x) {
    if(x == 2) {
        return true;
    }

    if(x < 2 || x % 2 == 0) {
        return false;
    }

    int i = 3;
    while(i <= sqrt(x)) {
        if(x % i == 0) {
            return false;
        }
        i = i + 2;
    }
    return true;
}

int main() {
    int n;
    cin >> n;
    int a[n];
    for(int i = 0; i < n; i++) {
        cin >> a[i];
    }
    int count = 0;
    for(int i = 0; i < n; i++) {
        if(is_prime2(a[i])) {
            count++;
        }
    }
    cout << count << endl;
    return 0;
}

感想

問題文にあるようにそのままis_prime1関数のようなものを書くと時間オーバーで合格できません。

私は素数の理解ができておらず、計算量を減らすことはできませんでした。

上記一般解説にあるように素数ではない数を省いたり、余計な計算をしないことで計算量を大幅に減らせました。

アルゴリズムがそのまま書かれていますので、C++用に書いたものがis_prime2関数です。

正答率は30%台ですので、それなりの難易度で、数学を理解していないと難しいと感じました。

まとめ

AIZU ONLINE JUDGEの「ALDS1_1_C 素数」を解いてみましたので、その回答と解説をご紹介いたします。

少しずつですが、プログラミングの勉強をしています。
まだ初心者ですが、よかったらつながっていただけると嬉しいです。
Twitterアカウント(@mnbbbbbd

以上です。
読んでいただきありがとうございました!