4章 センター試験に出されるBASIC
平成9年実施のセンター試験から、数学A・Bの問題にBASICが出されるようになりました。比較的簡単なプログラムですから、簡単に点が取れます。(^^;
例として平成9年、数学で出された問題をあげてみます。
数学TA
次は自然数Nが平方数であるかどうかを判定するプログラムである。
10 INPUT "N=";N
20 FOR I=1 TO N
30 J=I*I
40 K=N-J
50 PRINT "K=";K
60 IF K=<0 THEN GOTO 80
70 NEXT I
80 IF K<0 THEN GOTO 110
90 PRINT "YES ";N;"=";I;"*";I
100 GOTO 120
110 PRINT "NO"
120 END
(1)このプログラムを実行して、Nに16を入力すると画面には
K=[アイ]
K=[ウエ]
K=[オ]
K=[カ]
YES [キク] = [ケ] * [コ]
が表示される。(1997年センター試験数学TA)
まず、前提条件としてNに16を入力すると書いてあるので、10行のINPUT文は無視して、N=16と考えます。
20行〜70行が繰り返しになっています。N=16なので、変数Iは1〜16まで変化します。
30行で変数Jに変数Iの平方を代入しています。
40行で16-Jを変数Kに代入しています。
50行でこの変数Kを表示しています。
60行で変数Kが0以下になったら繰り返しをやめて80行へ飛べという条件分岐となっています。
つまり、ある整数の平方がN(=16)よりも大きいか等しくなる、そんな最大の整数を求めています。
表示される値Kは、N(=16)から整数の平方を引いたものです。
ですから、[アイ]=16-1=15、[ウエ]=16-4=12、[オ]=16-9=7、[カ]=16-16=0となります。
80行では変数Kが0未満であれば110行に飛べという条件分岐です。
90行は平方数であった場合にのみ実行されます。
YES 16=I*Iと表示するのですから、難しく考えなくてもI=4とわかります。
100行は単にEND命令のある120行へとばしているだけです。
110行ではNは平方数ではないと表示しています。
120行にENDがありますので、ここで実行終了です。
数学UB
次のプログラムを実行すると数の入力を2回求めてくる。このとき、二つの正の整数を入力して実行するとして、下の問いに答えよ。
100 INPUT "a=";A
110 INPUT "b=";B
120 Q=INT(A/B)
130 R=A-Q*B
140 PRINT Q
150 IF R=0 THEEN GOTO 190
160 A=B
170 B=R
180 GOTO 120
190 PRINT B
200 END
(1)a=?に対し12、b=?に対し4を入力したとき、画面に数を新たに[ア]個表示して停止する。表示される最初の数は[イ]、次の数は[ウ]である。
(2)a=?に対し548、b=?に対し141を入力したとき、行120を[エ]回実行してから停止する。
表示される最初の数は[オ]、次の数は[カ]、三番目の数は[キ]である。
(3)a=?に対しある数k、b=?に対し100を入力したところ、表示された最初の3個の数は順に2,4,2であった。このとき、k=[クケコ]である。(1997年センター試験数学UB)
(1)では前提条件においてA=12、B=4と入力することが示してあります。ですから実際に見ていくのは120行以降となります。
120行で、AわるBの小数点下を切り捨てたものをQに代入しています。この場合、12わる4は3.0ですので、Q=3です。
130行で、RにA-Q*Bを代入しています。よってここから、RにはAをBでわった余りが入ることがわかります。この場合、R=0です。
140行ではQを表示しています。
150行で余りRが0ならば190行へとばしています。この(1)ではR=0ですので、190行に行きます。
190行でBを表示し、200行のENDで実行終了です。
問題によると、画面に何個の数字か表示され、その最初の数と2番目の数を求めろということですが、上より、140行で1個、190行で1個の計2個の数字が表示されます。その値は、QとBですから、3と4です。
さて、このプログラムは何をするプログラムでしょうか。実はユークリッドの互除法で最大公約数を求めるプログラムなのです。ただ問題では結果というより経過のほうを重要視しているようですが。
(2)においてはA=548、B=141と前提条件に記してあります。このとき、120行は何回実行されるかというものです。これは実際にやってみるしかないでしょう。このプログラムではR=0となるまで、120行から180行を繰り返し実行しています。
1回目:Q=INT(548/141)=3, R=125
2回目:Q=INT(141/125)=1, R=16
3回目:Q=INT(125/16)=7, R=13
4回目:Q=INT(16/13)=1, R=3
5回目:Q=INT(13/3)=1, R=1
6回目:Q=INT(3/1)=3, R=0
となり、晴れて6回目でR=0になりました。よって答えは6。表示される数はそれぞれQですから、3, 1, 7となります。
(3)Bの値を100として表示される最初の3個の数値が2, 4, 2である時の、Aの値を求めよという問題です。未知数も含めて書いてみましょう。
1回目:Q=INT(k/100)=2
2回目:Q=INT(100/R1)=4
3回目:Q=INT(R1/R2)=2
ここで、まず1回目の結果から、Aを100でわった商が2である、すなわちAは200以上299以下の数値であることがわかります。
そこで、Q, Rの値を追跡してみましょう。
1回目:Q=2, R=k-200
2回目:Q=4=INT(100/(k-200)), R=A-B*Q=100-4*(k-200)=900-4k
3回目:Q=2=INT((k-200)/(900-4k)), R=A-B*Q=(k-200)-2*(900-4k)=9k-2000
まず、100/(k-200)の小数点下を切り捨てたものが4であることに着目しましょう。A(=k)は200以上299以下の数値ですから、k-200は0以上99以下の数値です。ですから、100/(k-200)して4になる数値は20<(k-200)<=25となります。従って、kは220より大きく、225以下の数値であることがわかりました。
それぞれの場合について3回目の結果を考えてみましょう。
k=221:Q=INT(21/16)=1
k=222:Q=INT(22/12)=1
k=223:Q=INT(23/8)=2
k=224:Q=INT(24/4)=6
k=225:Q=INT(25/0):存在しない(無限大)
ここで、Q=2を満たしているのはk=223のときだけ。よってk=A=223と求まりました。