> オリジナルの prime.bas のソースはこれだけです。
なるほど、MODって関数なんですね。
N88-BASICでは演算子なんですけどね。
> INPUT n
> IF MOD(n,2)=0 THEN
> IF n=2 THEN PRINT "素数" ELSE PRINT "合成数"
> ELSE
> FOR i=3 TO SQR(n) STEP 2
> IF MOD(n,i)=0 THEN EXIT FOR
> NEXT i
> IF i<=SQR(n) THEN PRINT "合成数" ELSE PRINT "素数"
> END IF
> END
これをそのままN88-BASICに移植すると、こんな感じかなぁ。
実行していないので、そのまま動くかどうかはわかりません。
00 INPUT N
10 IF N MOD 2=0 THEN 120 ELSE *ELSE1
20 IF N=2 THEN PRINT "素数" ELSE PRINT "合成数"
30 GOTO *ENDIF1
40 *ELSE1
50 I=3
60 WHILE (I<=SQR(N)) AND (N MOD I<>0)
70 I=I+2
80 WEND
90 IF I<=SQR(N) THEN PRINT "合成数" ELSE PRINT "素数"
200 *ENDIF1
210 END
解説すると
・MODは演算子に変更した。
・110行目のTHENの行番号は省略できたかもしれない。
つまり、NULLの行番号が許容されるのなら、その場合は単に次の行に制御が移る。
・ループの脱出条件が複数あるので、FORループからWHILEループに変更した。
> TurboBasic で同じやり方はわからなかったので、自分なりに改造したのが以下
TurboBasicって、MOD関数またはMOD演算子ってないんですか?
あと、NEXTの後ろの変数って省略できないんですか?
でもコンパイラ言語だからあんまり関係ないのか。
8ビットのBASICのころは、NEXTの後ろの変数を省略するとマイクロ秒の単位で速く
なると信じられていて、だから私も省略するのが癖になっているのですよ。
高速化といえば、最初のFORの直下のIF文。
これはループの中に入れておくのはもったいない。
だって、1回しか比較する必要がないものを何回も比較することになるわけだから。
> i=2:gosub PRINT i;:c=c+1 ' 2 素数
> FOR i=3 TO n
こんな感じで十分だと思う。