!OPTION ARITHMETIC decimal_high
LET t0=TIME
DIM S(1000000) !S1,S2,…,Sn
LET S(1)=1
FOR k=2 TO 1000000
LET S(k)=S(k-1)+k !左辺 1+ … +(k-1)+k の値
NEXT k
LET c=0 !個数
FOR n=1 TO 1000000
LET key=S(n)/2 !「全体の半分の値」を見つける
LET L=1 !下限
LET H=n !上限
DO WHILE L<=H !逆転したら終了
LET M=INT((L+H)/2) !中央
IF S(M)<=key THEN LET L=M+1 !絞り込む
IF S(M)>=key THEN LET H=M-1
LOOP
!!!PRINT n;L;H
IF L=H+2 THEN !見つかったら
LET c=c+1
PRINT c;"個目"
PRINT "1 + … +";M;"=";M+1; !左辺と=
IF M<n-1 THEN !整形のため
PRINT "+ … +";n; !右辺
END IF
PRINT "(=";S(M);")" !和
END IF
NEXT n
PRINT "計算時間=";TIME-t0
END
●「2次方程式を解く」の別解としてのサンプル
FOR k=1 TO 1000000
nについての2次方程式 n^2+n-2*(k^2+k)=0 を解いて正の整数解を得る
NEXT k
これは、数列{Sk,Sk+1,…}の中から、2*Skを探すことです。
無限個の中を探索できないので、(実際は小さい順に整列しているので途中で中止する)
!OPTION ARITHMETIC decimal_high
LET t0=TIME
LET c=0 !個数
FOR N=2 TO 1000000
LET S=N*(N+1)/2 !全部の和
LET a=INT(SQR(S)) !=が入る箇所の可能性
FOR k=a TO a+1
LET L=k*(k+1)/2 !左辺の和
IF 2*L=S THEN !2*左辺=全部の和なら、条件をみたす
LET c=c+1
PRINT c;"個目"
PRINT "1 + … +";k;"="; !左辺と=
IF i=N-1 THEN !整形のため
PRINT k+1;"(=";L;")" !右辺と和
ELSE
PRINT k+1;"+ … +";N;"(=";L;")"
END IF
END IF
NEXT k
NEXT N
PRINT "計算時間=";TIME-t0
END
!OPTION ARITHMETIC decimal_high
LET t0=TIME
LET a=1000000
LET n=1 !先頭から
LET k=1
LET c=0 !個数
DO UNTIL n>a OR k>a-1 !どちらかのデータ列が終わるまで
LET s1=n*(n+1)/2 !データ列を得る
LET s2=2*k*(k+1)/2
IF s1=s2 THEN !マージする
LET c=c+1
PRINT c;"個目"
PRINT "1 + … +";k;"=";k+1; !左辺と=
IF k<n-1 THEN !整形のため
PRINT "+ … +";n; !右辺
END IF
PRINT "(=";s1/2;")" !和
LET k=k+1
LET n=n+1
ELSEIF s1>s2 THEN
LET k=k+1
ELSE
LET n=n+1
END IF
LOOP
PRINT "計算時間=";TIME-t0
END
質問です・・・
投稿者:NINA 投稿日:2008年11月 9日(日)22時54分19秒「1,2,3,…,n の順に並んでいる数列のなかで、“+”と“=”を入れて式を完成させよ。」
というような、課題がでました。問題の答えの例としては
1+2=3
1+2+3+…+14=15+16+17+…+20 (=105)
という様な感じです。
これを十進BASICで1,000,000桁までくらいの等式をつくれ ということ言われ、やってみたのですが、
BASICを使うのは初めてなので、どんな風にプログラムを作ればいいのかわかりません。
どなたかご指導いただければと思い、投稿させていただきました。
わかるかた、ぜひよろしくお願いします!!