ページ 11

Atcoder 実行時エラー

Posted: 2021年6月15日(火) 14:48
by 03life
atcoderの下記の問題を以下のようなコードで書いたところ実行時エラーと不正解になります。
解決方法を教えていただきたいです。

https://atcoder.jp/contests/abc095/tasks/abc095_b


--コード

コード:

nclude <stdio.h>

int main(void)
{
    int N,X;
    int m[1001];
    int mMax = 0;
    int min;
    int sum = 0;
    scanf("%d%d",&N,&X);
    for(int i=0; i<N; i++) {
        scanf("%d",&m[i]);
        mMax += m[i];
    }

    for(int j=0; j<N; j++) {
        for(int k=1; k<N; k++) {
            if(m[j] < m[k]) {
             min = m[j];
            }
        }
    }

    sum = N + ((X-mMax) / min);
    
    printf("%d\n",sum);
    return 0;
}

Re: Atcoder 実行時エラー

Posted: 2021年6月15日(火) 14:54
by 03life
コピーのミスで #include の #iが抜けています

Re: Atcoder 実行時エラー

Posted: 2021年6月15日(火) 19:15
by みけCAT
minの扱いが不適切です。

例えば

コード:

2 100
2
1
という入力を与えると、 m[j] < m[k] を満たす j, k の組み合わせが存在しないため、
未初期化の自動変数minの値(不定)が計算に使われ、未定義動作になります。
例えば、minの初期値がたまたま0だった場合、
整数のゼロ除算により強制終了(ランタイムエラー)になるかもしれません。

どんな入力が来ても、sum の計算の前に m_i の最小値が min に入るよう、
プログラムを修正するといいと思います。

Re: Atcoder 実行時エラー

Posted: 2021年6月19日(土) 21:31
by 03life
みけCAT さんが書きました:
2年前
minの扱いが不適切です。

例えば

コード:

2 100
2
1
という入力を与えると、 m[j] < m[k] を満たす j, k の組み合わせが存在しないため、
未初期化の自動変数minの値(不定)が計算に使われ、未定義動作になります。
例えば、minの初期値がたまたま0だった場合、
整数のゼロ除算により強制終了(ランタイムエラー)になるかもしれません。

どんな入力が来ても、sum の計算の前に m_i の最小値が min に入るよう、
プログラムを修正するといいと思います。
ありがとうございます!解決できました!!