2011年センター試験、数学プログラム問題が
新聞に載っていたので
それについてです。
問題全文は1月17日の新聞を参照してください。
問題を最初から解いている場面を想定したレポートです。
ん~今年はどんな問題かなー
え~っと
nを2以上の自然数とし
nが偶数ならば、nを2で割る。
nが奇数なら、nを3倍にして1を加える。
この操作をnが1になるまで繰り返す。
例えば10の場合は、
10 → 5 → 16 → 8 → 4 → 2 → 1
F(N)がNから始めて1になるまでの操作の回数で
F(10) = 6
で最初の問題はF(6)とF(11)を出すのね。
手で書いて出せばいいね。
矢印は省略するけど、
6 3 10 5 16 8 4 2 1
11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
あとは数えて~
F(6) = 8
F(11) = 14
5が出てからは当然ながら
5 16 8 4 2 1
と同じだね。
次はプログラム中の空欄を埋める問題
[エ]は
もしIが1ならもう操作しなくてもいいから
190、200、210のどれかだけど
確定できないから飛ばし。
次は[オ][カ][キ]の空欄ね~
オカキってせんべいを連想しちゃったよ~
こんな時に、
[オ]と[カ]と[キ]ね。
まず[オ]、
Iが偶数ならする操作ってことで
LET I=I/2
[カ]は~
残りの選択肢は
「GOTO」系か
「Cの計算」系かしかないからー
そんでもってCはCountのCだから操作の回数をいれる変数。
それで、
GOTOはやっぱり
Iが1かどうか確かめる130行に戻るわけだし
戻る前にCを1増やしとかないといけないので
C = C+1
[キ]はGOTO 130
これで[エ]がわかるね。
[エ]は[キ]GOTO 130の後行の210。
[ク]はN=24のとき180行が実行される回数か~
180行は、LET I=3*I+1
なのでIが奇数のときに実行される。
だから手で書いて奇数のときを数えればいい。
24 12 6 3 10 5 16 8 4 2 1
奇数は3と5の2回よって[ク]は2。
次からは恒例のプログラム一部変更問題だね。
F(N) <= 10 になるNだけ表示するようにするわけね~
For文でNを1からMまで変化させて
それぞれのF(N)を求めて
IF文でF(N) <= 10かどうかを判定するという流れ。
今更だけど、
F(N)はプログラム中ではCだね。
今までのプログラムをFor文で挟むだけみたいだから
簡単?かもね~
[ケ]は、「○○のときCを出力する」だから
当然C<=10。
[コ]は、選択肢の中に「NEXT」があるよ。
そういえばForに対するNextがまだないね。
FORの変数はNだから
[コ]は、NEXT N
ここでプログラムの基本中の基本を出すか~
次は最後の問題[サ]
変更後のプログラムでM=10を入れると
210行のPRINT文は何回実行されるか?
ん~っと
210行のPRINT文は
C<=10のとき実行されるから、
Nが1から10までのF(N)を手で書いて求めて
F(N)<=10になるNの数を数えれば解けるね。
まずは1から10までの数字を書く。
| N |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
| F(N) |
|
|
|
|
|
|
|
|
|
|
F(1) = 0
F(2) = 2
F(4) = 3
F(8) = 4
F(10) = 6
は簡単。
F(10)は問題文中に書いてあるし~
| N |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
| F(N) |
0 |
1 |
|
2 |
|
|
|
4 |
|
6 |
F(5)はこれを再利用すれば出るね。
10 → 5 → 16 → 8 → 4 → 2 → 1
つまり
5 → 16 → 8 → 4 → 2 → 1
でF(5)=5
他にも再利用できるものがないか探してみると
F(6)とF(11)を解いたとき書いたヤツが使えるかも…
ってF(6)ももうわかってるね。
6 3 10 5 16 8 4 2 1
11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
だから
F(6)=8
F(3)=7
| N |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
| F(N) |
0 |
1 |
4 |
2 |
5 |
8 |
|
4 |
|
6 |
残りは7と9。
大きいほうの9からF(N)を求めよう。
途中で7が出てくるかもしれないし…
9 28 14 7
おっ、7来た。
9 28 14 7 22 11 34 …
11って前に出てきたよね。えっと
F(11) = 14
つまり9も7もF(N)は10より大きい。
| N |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
| F(N) |
0 |
1 |
4 |
2 |
5 |
8 |
× |
4 |
× |
6 |
[サ]は8、終わり。
ってな感じでできたらいいですよね~
問題中のプログラムをVBAでやってみます。
コードはこちら
センター試験2011数学プログラム問題のコード: Sub macro110122a() 'センター試験2011 '数学プログラム問題 '問題は2011/01/17の新聞で
Dim N As Integer Dim I As Integer Dim C As Integer N = InputBox("2以上10^5以下の自然数Nを入力してください") Let I = N Let C = 0 Step130: If I = 1 Then GoTo Step210 If Int(I / 2) * 2 = I Then Let I = I / 2 GoTo Step190 End If Let I = I * 3 + 1 Step190: C = C + 1 GoTo Step130 Step210: Debug.Print ("F(" & N & ") = " & C) 'End End Sub
Sub macro110122b() 'センター試験2011 '数学プログラム問題(変更後) '問題は2011/01/17の新聞で
Dim N As Integer, M As Integer Dim I As Integer Dim C As Integer M = InputBox("2以上10^5以下の自然数Mを入力してください") For N = 1 To M Let I = N Let C = 0 Step130: If I = 1 Then GoTo Step210 If Int(I / 2) * 2 = I Then Let I = I / 2 GoTo Step190 End If Let I = I * 3 + 1 Step190: C = C + 1 GoTo Step130 Step210: If C <= 10 Then Debug.Print ("F(" & N & ") = " & C) Next N 'End End Sub |
macro110122a実行中のダイアログ
Nの値を入力する。
macro110122a実行後のイミディエイト例
macro110122b実行中のダイアログ
Mの値を入力する。
macro110122b実行後のイミディエイト例
今年の問題は2段階目のひねりが
少ないように感じました。