問題2 解説

 非常に簡単な問題である.主題は「入力データファイルの読み込み」と「基本的なプログラミング」ができるかどうかを問うことにあった.

 入力データをファイルから配列または変数に読み込んだ後,公約数を求めていくことになるが,求め方はいろいろな方法が考えられる.もっとも単純な方法は,除数として 1 から入力データの最小値までの整数を順に 1 ずつ増やしながら,入力データを割ってみて,すべて割り切れた場合はその除数は公約数として出力する,ということを繰り返す方法である.この方法でも入力 in3 や入力 in5 で若干の処理時間をとられるものの,十分に速い.

 若干の工夫を加えるならば,例えば以下のような方法が考えられる. まず,入力データの最小値を求める. その最小値の約数リストを以下の方法で作成する.
  1. 1 から「最小値の平方根」までのループを作り,最小値が割り切れるか否かをテストする.
  2. 割り切れた場合,そのときの「除数」と「商」を約数リストに記録する.
  3. 約数をすべて求め終わったら,そのリストをソートして昇順(小さい順)に並べ替える.
  4. 昇順に並んだ約数リストの各値がその他の入力データを割り切るか否かを順にテストする.
  5. すべて割り切れた場合,公約数として出力する.
 この方法は前述の単純な方法に比べ,主ループが平方根のオーダーで小さくなるので,実行時間が少なくて済む.
 この方法を使う場合気になるのは,約数の個数(約数リストを記録する配列のサイズをどのくらい大きくとったらよいか)であるが,次のことが証明できるので,大きなサイズの配列を用意する必要はない.

 正の整数 x の約数の個数は, x = apbqcr・・・ と素因数分解されるとき, (p + 1)(q + 1)(r +1)・・・ である.

入力データの大きさはたかだか 108<232 であるから,約数の個数はたかだか 33 個である.