数学II・数学B 第6問

この問題ややこしいです。試験場で冷静に問題を追いかけてくのは困難でしょう。ついでに出した答が正解なのか自信が持てません。他の問題を選択するのが賢明でしょうか。

第6問 (選択問題)(配点 20)
正の整数$a_1$$a_2$$c$が与えられたときに,$s_1 = a_1$とし
\begin{displaymath}\begin{array}{rclll}s_i & = & s_{i-1} + a_i & (i = 2, 3, \......) & (i = 1, 2, 3, \cdots) & \cdots\cdots\mbox{(ii)}\end{array}\end{displaymath}
によって得られる数の列$a_3, a_4, \cdots , a_n$を表示させるために,次のようなプログラムを作ってみた。
以下のプログラムにおいて INT(X) Xを越えない最大の整数を与える関数である。
    100 INPUT "a1,a2,c=";A,B,C
    110 INPUT "n=";N
    120 S = A
    130 FOR J=3 TO N
    140     A = B+INT(S/C)
    150     PRINT "a(";J;")=";A
    160     B = A
    170     S = S+A
    180 NEXT J
    190 END
このプログラムが意図どおりに動作するかどうか確かめてみる。

さて、訳の解らない数列が与えられました。おまけにそれを計算するプログラムまで作られてます。それでプログラムが期待通りに動くか確かめてみようよと言われてます。

(1) このプログラムを実行し, a1,a2,c=?に対して 1,1,1を入力し, n=?に対して 6を入力すると
a(3)=[ ア ] a(4)=[ イ ] a(5)=[ ウ ] a(6)=34
が表示される。また, a(6)が表示される直前の Sの値は[ オカ ]である。

テストデータを流してプログラムの挙動を確かめます。まあコンピュータになりきってやっても良いんですが。
与えられた数列がどんな感じなのか解らないのに、いきなりコンピュータになるのは気が進みません。数列の値をいくつか求めて感じをつかんでから、アルゴリズムに馴染んでからプログラム検証に私は行きたい!
と主張が盛りあがったところで問題を先読みしてみると(2)は数列の値を求めるみたいです。こっちを先にやることにします。

(2) 次に,定義の式(i),(ii)に従って計算してみる。
$a_1 = 1$$a_2 = 1$$c = 1$とすると
$a_3 = \mbox{[ キ ]}, a_4 = \mbox{[ ク ]}, a_5 = \mbox{[ ケ ]}, a_6 = \mbox{[ コサ ]}, \cdots$となる。

では与えられた漸化式に従って値を求めていきましょう。まずは
\begin{eqnarray*}a_3 & = & a_2 + \left\lfloor\frac{s_1}{c}\right\rfloor \\&......eft\lfloor\frac{1}{1}\right\rfloor \\& = & 1 + 1 \\& = & 2\end{eqnarray*}
です。ここで$\lfloor x \rfloor$$x$の整数部分と言うことにして下さい。続いて$a_4$に。$c$は1なので割り算の部分は無視します。
\begin{displaymath}a_4 = a_3 + s_2\end{displaymath}
とやってハタと手が止まります。先に$s_2$求めないと。
\begin{displaymath}s_2 = s_1 + a_2 = 1 + 1 = 2\end{displaymath}
ですね。この辺で「ははあ」と仕組が解ってきます。あとは一気に
\begin{displaymath}\begin{array}{ll}a_3 = a_2 + s_1 = 1 + 1 = 2, & s_2 = s_1 ......a_4 = 4 + 4 = 8 \\a_6 = a_5 + s_4 = 8 + 8 = 16\end{array}\end{displaymath}
となります。大体計算方法が解りましたね。
$a_3 = \mbox{[ キ ]} = 2, a_4 = \mbox{[ ク ]} = 4, a_5 = \mbox{[ ケ ]} = 8, a_6 = \mbox{[ コサ ]} = 16$

(1) このプログラムを実行し, a1,a2,c=?に対して 1,1,1を入力し, n=?に対して 6を入力すると
a(3)=[ ア ] a(4)=[ イ ] a(5)=[ ウ ] a(6)=34
が表示される。また, a(6)が表示される直前の Sの値は[ オカ ]である。

さて様子が解りました。(1)に戻ってプログラム検証をしましょう。さっき自分でやった計算をコンピュータにキチンとやらせてれば大丈夫です。コンピュータになりきってやってみると
\begin{displaymath}\begin{array}{c\vert c\vert c\vert c\vert c\vert c\vert c}...... \\140 & & 34 & & & & \\150 & & & & & & a(6)=32\end{array}\end{displaymath}
となります。もういきなり間違いが解ってやる気はなくなるんですが、問題で聞かれてるのでループを辿ります。どうも Sの計算が間違ってる感じでしょうか。
とにかく、これでマークシートは埋まって
a(3)=[ ア ]=2、 a(4)=[ イ ]=5、 a(5)=[ ウエ ]=13
です。また a(6)が表示される直前の Sの値は21です。
答 [ オカ ] = 21

(3) (1),(2)よりプログラムのどこかに誤りがあることがわかった。このプログラムの 160行, 170行を修正して,はじめに意図したように動かしたい。
    130 FOR J=3 TO N
    140     A = B+INT(S/C)
    150     PRINT "a(";J;")";A
    160     [ シ ]
    170     [ ス ]
    180 NEXT J
の[ シ ],[ ス ]に当てはまるものを,次の(0)〜(9)のうちから一つずつ選べ。
    (0) A = B    (1) B = A  (2) A = A+1  (3) B = B+1  (4) S = S+A
    (5) S = S+B  (6) S = A  (7) S = A+B  (8) S = S+1  (9) S = B+1

さて誤りを直しましょう。漸化式と照らし合わせて考えれば解ります。
まず140行に着目します。この
A = B+INT(S/C)
は漸化式の
$a_{i+2} = a_{i+1} +\left({\displaystyle\frac{s_i}{c}}\mbox{の整数部分}\right)$
に対応してます。
140行が実行されるとき各変数は
\begin{displaymath}\begin{array}{ccc}A & : & a_{i+2} \\B & : & a_{i+1} \\S & : & s_i\end{array}\end{displaymath}
に対応します。次にループが回ってくるときは
\begin{displaymath}\begin{array}{ccc}A & : & a_{i+3} \\B & : & a_{i+2} \\S & : & s_{i+1}\end{array}\end{displaymath}
に対応するようにしないといけません。そのためには160行、170行で B$a_{i+2}$ S$s_{i+1}$にする処理をすれば良いです。
漸化式より$s_{i+1}=s_i + a_{i+1}$なので、 S = S + Bを実行すれば S$s_{i+1}$に対応するようになります。
また$a_{i+2}$ Aに入っているので、 B=Aを実行すれば B$a_{i+2}$に対応するようになります。
これでやる処理は解りました。あとは処理の順番に気を付けるだけ。 B=Aを先に実行すると$a_{i+1}$を保持してる変数がなくなってしまいます。
ということで、160行、170行は
    160 S = S+B
    170 B = A
答 [ シ ] = (5)、[ ス ] = (1)

((4) (3)のように修正したプログラムを実行し, a1,a2,c=?にたいして 1,1,2を, n=?にたいして6を入力するとき, a(6)が表示される直前の Bの値は[ セ ]である。

再びコンピュータになってプログラムを追いかけても良いんですが、立ち止まって三秒考えましょう。 a(6)が表示される直前の Bには何が入ってますか? (3)で分析したから解りますね。そのとき Bには$a_5$が入ってます。
プログラム追いかけるより漸化式計算した方が簡単そうなので、$a_5$を漸化式で計算して答にします。
\begin{displaymath}\begin{array}{ll}a_3 = a_2 + \left\lfloor{\displaystyle \f......or{\displaystyle \frac{3}{2}}\right\rfloor = 3, &\end{array}\end{displaymath}
答 [ セ ] = 3

せぎてつ伝言板
このページの感想をどうぞ!
お名前(匿名OK):

メールアドレス:
最終更新日 : 2001年10月28日(日)
segi@ra2.so-net.ne.jp