🏠 Home / 大学入試 / センター試験 / センターIIB

センター試験 数学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 IF
160行目で「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

関連するページ

YouTubeもやってます