ITP1_10_C 標準偏差をC++で解いてみた[AIZU ONLINE JUDGE]

AIZU ONLINE JUDGE

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

AIZU ONLINE JUDGEの「ITP1_10_C 標準偏差」を解いてみましたので、その回答と解説をご紹介いたします。

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

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

問題文

n 人の学生を含むクラスでプログラミングの試験を行った。それぞれの得点をs1, s2 … snとしたときの、標準偏差を求めるプログラムを作成せよ。

得点の平均値をmとすれば、分散α2は以下の式で得られる:

α2 = (∑ni=1(si – m)2)/n

分散の正の平方根が標準偏差αとなる。

Input

複数のデータセットが入力として与えられる。各データセットは以下の形式で与えられる:

学生の数n
S1 S2 ・・・ Sn

n が 0 のとき入力の終わりとする。

Output

各データセットに対して、標準偏差を1行に出力せよ。ただし、0.0001以下の誤差があってもよい。

Constraints

入力で与えられる n が1000を超えることはない。

0 ≤ si ≤ 100

https://onlinejudge.u-aizu.ac.jp/courses/lesson/2/ITP1/10/ITP1_10_C

解答

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

int main() {
    int n;
    double ans[1000] = {};
    int j = 0;
    while(cin >> n) {
        if(n == 0) {
            break;
        }
        int s[n];
        double m = 0;
        for(int i = 0; i < n; i++) {
            cin >> s[i];
            m += s[i];
        }
        m /= n;
        double tmp = 0;
        for(int i = 0; i < n; i++) {
            tmp += pow((s[i] - m), 2);
        }
        ans[j] = pow((tmp / n), 0.5);
        j++;
    }

    for(int i = 0; i < j; i++) {
        cout << fixed << setprecision(8) << ans[i] << endl;
    }

    return 0;
}

ハマったポイント

小数点の誤差が出てしまい、合格できず、その理由がわかりませんでした。

学んだこと

小数点を扱う場合、誤差が生じてしまうことがありますが、変数の型を丁寧に確認したいと思います。

まとめ

AIZU ONLINE JUDGEの「ITP1_10_D ミンコフスキー距離」を解いてみましたので、その回答と解説をご紹介いたしました。

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

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