センター試験 数学II・数学B 2006年度 第6問 解説
問題編
【問題】
2以上の自然数$n$を素因数分解し、その結果を出力するプログラムを作成した。[プログラム] 100 INPUT PROMPT "n=":N 110 LET I=2 120 IF [ア] THEN 130 LET I=I+1 140 GOTO [イウエ] 150 END IF 160 LET N=N/I 170 IF N=1 THEN 180 PRINT I 190 GOTO [オカキ] 200 END IF 210 PRINT I;"*"; 220 GOTO [イウエ] 230 ENDただし、100行、110行、160行は、それぞれ次の各行と同じ意味である。
100 INPUT "n=":N 110 I=2 160 N=N/Iまた、120行~150行は
120 IF [ア] THEN I=I+1:GOTO [イウエ]と同じ意味であり、170行~200行は
170 IF N=1 THEN PRINT I:GOTO [オカキ]と同じ意味である。(1) [ア]は「NはIで割り切れない」ということを意味する条件である。[ア]に当てはまるものを、次の0~5のうちから一つ選べ。ただし、INT(X)はXを超えない最大の整数を表す。
0: N-INT(I/N)*N<0
1: N-INT(N/I)*I<0
2: N-INT(I/N)*I<0
3: N-INT(I/N)*N<>0
4: N-INT(N/I)*I<>0
5: N-INT(I/N)*I>0(2) プログラム中の[イウエ]、[オカキ]に当てはまる行番号を入れよ。
(3) プログラムを実行し、変数Nに60を入力したとき、160行は[ク]回実行され、180行は[ケ]回実行される。また、変数Nに61を入力したとき、160行は[コ]回実行され、180回実行される。
[ク]~[サ]に当てはまるものを、次の0~7のうちから一つずつ選べ。ただし、同じものを選んでもよい。
0:0、 1:1、 2:2、 3:3、
4:4、 5:59、 6:60、 7:61(4) nを素数でない自然数とする。このプログラムを変更し、nの約数のうち素数であるものを、重複なく順に出力するようにするには、160行を削除して次の161行~164行を追加し、さらに210行の"*"を","と変更すればよい。
161 IF N-INT(N/I)*I=0 THEN 162 LET [シ] 163 GOTO [スセソ] 164 END IFこのとき、[シ]に当てはまるものを、次の0~7のうちから一つ選べ。
0:N=N/I、 1:N=N*I、 2:N=I/N、 3:N=N+I、
4:I=I+N、 5:I=I/N、 6:I=N/I、 7:I=I*Nまた、[スセソ]に当てはまる行番号を入れよ。
【考え方】
「素因数分解をして表示するプログラム」と、内容が書かれているので処理の想像はつきやすいです。
割り切れるか割り切れないかの処理に「INT」を使うのはよくあります。割り切れるときは、割った数に商を掛ければ元に戻ります。また、割り切れない場合は、割った数に商を掛けても元の数より小さくなります。このことを踏まえて(1)を解答します。
(2)は素因数分解をどうやって行うかを考えれば、何を繰り返すべきかがわかるので、何行目に飛ぶ必要があるかもわかるでしょう。
(3)は、各行が何の処理をしているか、どういうときに処理されるかを考えれば、処理を追っていかなくても答えることができます。
(4)は、素数の重複をなくすために、「素数で割り切れるときに、割り切れなくなるまでその素数で繰り返し割る」という処理をすればいい、と考えれば解くことができます。
解答編
【問題】
2以上の自然数$n$を素因数分解し、その結果を出力するプログラムを作成した。[プログラム] 100 INPUT PROMPT "n=":N 110 LET I=2 120 IF [ア] THEN 130 LET I=I+1 140 GOTO [イウエ] 150 END IF 160 LET N=N/I 170 IF N=1 THEN 180 PRINT I 190 GOTO [オカキ] 200 END IF 210 PRINT I;"*"; 220 GOTO [イウエ] 230 ENDただし、100行、110行、160行は、それぞれ次の各行と同じ意味である。
100 INPUT "n=":N 110 I=2 160 N=N/Iまた、120行~150行は
120 IF [ア] THEN I=I+1:GOTO [イウエ]と同じ意味であり、170行~200行は
170 IF N=1 THEN PRINT I:GOTO [オカキ]と同じ意味である。
【解説】
「素因数分解をして結果を出力するプログラム」と、何をするプログラムかが書かれているので、流れはある程度想像できると思います。
手作業で素因数分解をする場合は、「小さい数字から順に割っていく」という計算をしていきますが、このプログラムでも似たようなことをしています。
100行目で、素因数分解をしたい数字を入力しています。110行目で「I=2」とし、160行目を見ると、「N=N/I」となっているので、「Iで順番に割って行くんだな」と予想がつきます。130行目で「I=I+1」となっていますが、ここは、「NがIで割り切れなければ、Iの数を1増やして、NがIで割り切れるかチェックする」ということをやっていくと予想できます。
170行目では「N=1のとき」となっています。これは素因数分解が終わったことを表しています。結果を表示するPRINTは180行目と210行目に出てきますが、210行目はIと"*"を表示するので、素因数分解が終わっていないことを表しています。180行目が実行されるときは、素因数分解が終わっているので、掛け算の表示が不要なので「PRINT I」となっているわけですね。
まだ不明な点はありますが、ざっくりこういうことをしているんだろうな、と予想がついていればいいでしょう。
【問題】
(1) [ア]は「NはIで割り切れない」ということを意味する条件である。[ア]に当てはまるものを、次の0~5のうちから一つ選べ。ただし、INT(X)はXを超えない最大の整数を表す。0: N-INT(I/N)*N<0
1: N-INT(N/I)*I<0
2: N-INT(I/N)*I<0
3: N-INT(I/N)*N<>0
4: N-INT(N/I)*I<>0
5: N-INT(I/N)*I>0
【解説】
「NがIで割り切れるかどうか」をプログラムで処理する場合、「NをIで割った商とIとの積が、Nと一致するか」で判断することが多いです。もし割り切れればNと一致しますが、割り切れなければNと一致しません。
「NはIで割り切れない」は、「NをIで割った商とIとの積が、Nと一致しない」ということなので、選択肢4が正しいものになります。
なお、NをIで割った商とIとの積は、必ずN以下となるので、もし1が「N-INT(N/I)*I>0」というように、不等号の向きが反対であれば正しくなります。「I/N」は割り算が逆なので、何と掛けるか、不等号の向きはどちらかに関係なく、不適切となります。
【解答】
ア:4
【問題】
(2) プログラム中の[イウエ]、[オカキ]に当てはまる行番号を入れよ。
【解説】
120 IF [ア] THEN 130 LET I=I+1 140 GOTO [イウエ] 150 END IF先ほどの問題より、120行目では、「NがIで割り切れるか」をチェックしていることがわかりました。
120行から150行は、「NはIで割り切れなければ、Iを1増やす」という処理をしています。素因数分解をするには、この後さらに「NがIで割り切れるか」をチェックしないといけません。よって、140行目では、120行目に飛ぶ必要があります。
160 LET N=N/I 170 IF N=1 THEN 180 PRINT I 190 GOTO [オカキ] 200 END IF160行目で「N=N/I」となっているので、NをIでどんどん割っていきます。170行目で、Nが1かどうかを判断していますが、もし1なら素因数分解の処理が終わりということです。よって、190行目では最終行に飛ぶ必要があります。つまり、230行目に飛ぶ必要があります。
【解答】
イウエ:120
オカキ:230
【問題】
(3) プログラムを実行し、変数Nに60を入力したとき、160行は[ク]回実行され、180行は[ケ]回実行される。また、変数Nに61を入力したとき、160行は[コ]回実行され、180回実行される。[ク]~[サ]に当てはまるものを、次の0~7のうちから一つずつ選べ。ただし、同じものを選んでもよい。
0:0、 1:1、 2:2、 3:3、
4:4、 5:59、 6:60、 7:61
【解説】
160行は、120行目で「NがIで割り切れる」と判断され、割り算を行うところです。割り切れる回数分だけ処理されます。\[ 60 = 2\times 2\times 3\times 5 \]なので、60の場合は4回実行されます。
180行目は、素因数分解が終わったときに実行されるので、1回実行されます。
一方、61は素数なので、160行目は1回しか実行されません。180行目はどんな数字でも1回だけ実行されます。
【解答】
クサシス:4111
【問題】
(4) nを素数でない自然数とする。このプログラムを変更し、nの約数のうち素数であるものを、重複なく順に出力するようにするには、160行を削除して次の161行~164行を追加し、さらに210行の"*"を","と変更すればよい。
161 IF N-INT(N/I)*I=0 THEN 162 LET [シ] 163 GOTO [スセソ] 164 END IFこのとき、[シ]に当てはまるものを、次の0~7のうちから一つ選べ。
0:N=N/I、 1:N=N*I、 2:N=I/N、 3:N=N+I、
4:I=I+N、 5:I=I/N、 6:I=N/I、 7:I=I*Nまた、[スセソ]に当てはまる行番号を入れよ。
【解説】
変更した後のプログラムは次のようになっています。今までの結果も反映させています。
[プログラム] 100 INPUT PROMPT "n=":N 110 LET I=2 120 IF N-INT(N/I)*I<>0 THEN 130 LET I=I+1 140 GOTO 120 150 END IF 161 IF N-INT(N/I)*I=0 THEN 162 LET [シ] 163 GOTO [スセソ] 164 END IF 170 IF N=1 THEN 180 PRINT I 190 GOTO 230 200 END IF 210 PRINT I;"*"; 220 GOTO 120 230 END
161行目では、1番初めの問題(アの部分)と同様に考えると、「NがIで割り切れる」という条件になっています。
今回のプログラムでは、素数であるものを重複なく出力するので、120行目で「割り切れる」と判断した後は、「割り切れなくなるまで割る」処理をしなくてはいけません。よって、シには、「0:N=N/I」が入ります。
割り切れるまで繰り返すので、163行目では161行目に飛ぶ必要があります。よって、スセソには161が入ります。
【解答】
シ:0
スセソ:161