タイトル | : Re^10: N88-BASICで素数を表示カウントする PRIME88.BAS |
投稿日 | : 2024/03/27(水) 00:26 |
投稿者 | : konno | 番 号 | : 11176 11173 番 konno さんへのコメント コメント数 2 |
> ここ、多くの処理系では割り算よりも掛け算のほうが速いと聞いたことがあるので、> 割り算を2回するのではなく掛け算と割り算の組み合わせに変更してみました。> これでどのくらい早くなるかは測定していないからわからない。> 処理系によっては、むしろ遅くなったりして。なるほど、そういうやり方もあるのですね。 このプログラムで 10000 指定の実行結果は Number.10000 0: 0:30 Prime Number = 1233 このソースを私の FOR 文のに置き換えてみた結果は Number.10000 0: 0: 8 Prime Number = 1233 実行時間が短縮されました。 コンパイラでは最適化でインタプリタと違う結果になるようです。 どこがどう効いたかわからないので、変更ソースを上げます。 1320 *START 1330 TM$=TIME$ 1340 I=2:GOSUB *PRINT1 1350 FOR I=3 TO N '★ 1360 ' IF INT(I/2)*2 = I THEN *EXIT2 '☆ 1362 i2=i/2:i3=int(i/2):IF i2=i3 THEN goto *EXIT2 ' 合成数 1370 ' J=3 '☆ 1380 ' WHILE (J<SQR(I)) AND (INT(I/J)*J<>I) '☆ 1382 FOR J=3 TO int(SQR(I)) STEP 2 '★ 偶数をスキップ 1390 ' J=J+1 '☆ 1392 I2=I/J:I3=INT(I/J):IF I2=I3 THEN GOTO *EXIT1 '★ 合成数 1400 ' WEND '☆ 1402 NEXT J '★ 1404 *EXIT1 '★ 1406 ' if i=169 then print " 13 =";i;sqr(i);j:goto *exit2 1408 ' IF i=169 then if J=SQR(I) THEN *EXIT2 1410 IF SQR(I)<J THEN GOSUB *PRINT1 1420 *EXIT2 1430 NEXT I 1440 I=I-1 ちなみに、VGA版の結果は Number.10000 0: 0' 1 Prime Number = 1229 結果の素数の数が 4 違いますね。 --- N88 --- 169 13*13 5041 71*71 6241 79*79 9409 97*97 10000 で 4 箇所 合成数が含まれています。 何が原因かわからないです。
- No.11176 一括表示へ - コメント元:11173 一括表示へ - [ 返信 ] [引用無し] pre