初項 1 公差 1 の等差数列の中のある項よりも左と右の項の総和が等しくなるケースを求める十進BASIC のプログラムを、 十進BASIC_プログラミング > しらみつぶし法からの脱却 でご紹介しましたが、 初項 1 公差 1 の等差数列を2分したときに左右の総和が等しくなるケースを求める十進BASIC のプログラムは、 山中和義 / 電脳遊戯団 さんの次のサイトで公開されています。
http://www.urban.ne.jp/home/kz4ymnk/seminar/basic/index.html
110 DIM S ( 100000 )
120 LET S ( 1 ) = 1
130 FOR k = 2 TO 100000
140 LET S ( k ) = S ( k−1 ) + k
150 NEXT k
160 LET c = 0
170 FOR n = 1 TO 100000
180 LET key = S ( n ) / 2
190 LET L = 1
200 LET H = n
210 DO WHILE L <= H
220 LET M = INT ( ( L + H ) / 2 )
230 IF S ( M ) <= key THEN LET L = M + 1
240 IF S ( M ) >= key THEN LET H = M−1
250 LOOP
260 IF L−H = 2 THEN
270 LET c = c + 1
280 PRINT c;"個目"
290 PRINT " 1 ・・・ + " ;M; " = " ;M + 1;
300 IF M < n−1 THEN
310 PRINT " + ・・・ + " ;n;
320 END IF
330 PRINT "( = " ;S ( M ) ; " )"
340 END IF
350 NEXT n
360 END
このプログラムのアルゴリズムを見てみましょう。
110 〜 150 は、 初項1公差1の等差数列 ( 1 2 3 4 ・ ・ ・ ) の初項からその項までの和の数列を作っています。つまり、次のような数列です。
1 3 6 10 ・ ・ ・ ・
210 〜 250 は、 初項 1 公差 1 の n項までの等差数列 ( 1 2 3 4 ・ ・ ・ n ) の中央の項をピックアップして、初項からその項までの和が全項の和の半分になっていたら、 L−H = 2 としてからループを抜け、 初項からその項までの和が全項の和の半分よりも小さい時には中央の項の右隣りを新たにピックアップし、 初項からその項までの和が全項の和の半分よりも大きい時には中央の項の左隣りを新たにピックアップして、 同様の比較をしていって、 もし、 初項または終りから2項目をピックアップして同様の比較をしても、 初項からその項までの和が全項の半分になっていなければ、 ループを抜けます。
260 〜 340 は、 初項 1 公差 1 の等差数列を2分したときに左右の総和が等しくなるケースが見つかるたびに書き出しています。
170 と 350 は、 初項 1 公差 1 の等差数列の項の数を1から始めて1ずつ大きくして行き 100000 で終了します。
< コピペ用の窓 >
十進