オリジナルの prime.bas のソースはこれだけです。
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
IF 〜 ELSE 〜 END IF をうまく使ってシンプルでエレガントですね。
TurboBasic で同じやり方はわからなかったので、自分なりに改造したのが以下
FOR i=2 TO n
IF i=2 THEN gosub PRINT i;:c=c+1 ' 2 素数
i2=i/2:i3=int(i/2):IF i2=i3 THEN goto EXIT2 ' 合成数
FOR j=3 TO SQR(i) STEP 2 ' 偶数をスキップ
i2=i/j:i3=int(i/j):IF i2=i3 THEN goto EXIT1 ' 合成数
NEXT j
EXIT1:
IF j>SQR(i) THEN gosub PRINT i;:c=c+1 ' 素数
EXIT2:
NEXT i:i=i-1
としきさんにループの抜け方が強引と言われたけど、うーむ・・・
IF MOD(n,i)=0 THEN EXIT FOR
ここは
i2=i/j:i3=int(i/j):IF i2=i3 THEN goto EXIT1 ' 合成数
↓
i2=i/j:i3=int(i/j):IF i2=i3 THEN i=i+1 ' 合成数
にすればよかったのかな。
つい、EXIT という構文に引っ張られたような・・・(^^;