次の関数rangeSumで累積和prefixを作る。a[3]からa[5]までの合計を返すため、空欄に入る式はどれか。aとprefixの要素番号はどちらも1から始まり、forの両端を含む。prefixの要素数はaより1多い。 ○ 整数型: rangeSum() 整数型の配列: a ← {2, 5, 1, 4, 6, 3} 整数型の配列: prefix ← {0, 0, 0, 0, 0, 0, 0} 整数型: i for (i を 1 から 6 まで 1 ずつ増やす) prefix[i + 1] ← prefix[i] + a[i] endfor return 【空欄】
本サイトで独自に作成。IPAの試験問題からの転載ではありません。
公開日:
選択肢を選んで、答え合わせをしましょう。
回答せずに正解・解説を確認する
正解:イ prefix[6] - prefix[3]
この表示だけでは、回答数や正答率は変わりません。
解説
prefix[k+1]にはa[1]からa[k]までの合計が入ります。a[3]〜a[5]の合計は、a[1]〜a[5]からa[1]〜a[2]を引けばよいのでprefix[6] − prefix[3]です。prefixは{0,2,7,8,12,18,21}となり、18 − 7 = 11で、1+4+6とも一致します。
a[2]〜a[4]の合計に対応し、対象区間が一つずれています。
末尾a[5]までの累積和から、開始a[3]の手前までを引いています。
a[2]〜a[5]の合計になり、a[2]=5を余分に含みます。
a[3]〜a[4]の合計になり、a[5]=6が抜けます。
関連知識
この定義では区間a[L]〜a[R]の合計はprefix[R+1] − prefix[L]です。prefix[k]がどこまでの合計を表すかは定義によって変わるため、添字の式を丸暗記しないようにします。
間違えやすいポイント
prefix[1]=0という番兵用の要素があるため、aとprefixで同じ要素番号が同じ終点を表すわけではありません。
覚え方
終点までの合計から、始点の手前までを引く。
実務での意味
毎日の売上から多くの期間合計を求めるような場合、前計算後は差を取るだけで集計できます。
解説:本サイト編集部によるオリジナル文章