Qiitaからの移植です。
『シクシク素数列 Advent Calendar 2018』14日目の記事です。 シクシク素数列を出力するプログラムを十進BASICで実装します。
ルール
- 数値に4か9を含む素数をシクシク素数と呼ぶことにします
- 19とか41とか149とか。
- 標準入力として正の整数 N を与えたら N 番目までのシクシク素数を半角カンマ区切りで標準出力してください
- 例 N = 9 の場合、
19,29,41,43,47,59,79,89,97
- 例 N = 9 の場合、
- N は最大で 100 とします
実装
エラトステネスの篩で素数列を生成するコードをベースに実装しました。
DECLARE EXTERNAL FUNCTION IS_SKSK LET MAX_SKSK_NUM = 100 DIM SKSK(MAX_SKSK_NUM) ! store 4949 prime FOR I = 1 TO MAX_SKSK_NUM LET SKSK(I) = 0 NEXT I !sieve of Eratosthenes LET MAX_NUM = 10000 ! magic number DIM IS_PRIME(MAX_NUM) LET IS_PRIME(1) = 0 FOR I=2 TO MAX_NUM LET IS_PRIME(I) = 1 NEXT I LET SKSK_COUNT=0 FOR I=2 TO MAX_NUM IF IS_PRIME(I)>0 AND IS_SKSK(I) > 0 THEN LET SKSK_COUNT=SKSK_COUNT+1 LET SKSK(SKSK_COUNT)=I IF SKSK_COUNT>=MAX_SKSK_NUM THEN EXIT FOR END IF END IF LET J=I*2 DO WHILE J<=MAX_NUM LET IS_PRIME(J)=0 LET J = J + I LOOP NEXT I ! output LET ANS$="" FOR I=1 TO SKSK_COUNT LET ANS$ = ANS$ & STR$(SKSK(I)) IF I < SKSK_COUNT THEN LET ANS$ = ANS$ & "," END IF NEXT I PRINT ANS$ END EXTERNAL FUNCTION IS_SKSK(X) LET IS_SKSK = 0 LET Y = X DO WHILE Y > 0 LET R = MOD(Y, 10) IF R = 4 OR R = 9 THEN LET IS_SKSK = 1 EXIT DO END IF LET Y = INT(Y/10) LOOP END FUNCTION
出力は以下の通りです。
19,29,41,43,47,59,79,89,97,109,139,149,179,191,193,197,199,229,239,241,269,293,347,349,359,379,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,509,541,547,569,593,599,619,641,643,647,659,691,709,719,739,743,769,797,809,829,839,859,907,911,919,929,937,941,947,953,967,971,977,983,991,997,1009,1019,1039,1049,1069,1091,1093,1097,1109,1129,1193,1229,1249,1259,1279,1289,1291,1297,1319
余談:なぜ十進BASICを選んだのか
私が初めて触れたプログラミング言語が十進BASICで、特別な存在だったからです。出会ったのは中学生のとき(15年くらい前)です。
久しぶりの十進BASICだったので、文法をいろいろ忘れていました。久しぶりに書いて感じたのは、コーディングがつらいということですね。C言語の方が書きやすいです。