問題編
【問題】
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)は、素数の重複をなくすために、「素数で割り切れるときに、割り切れなくなるまでその素数で繰り返し割る」という処理をすればいい、と考えれば解くことができます。