Edited at

シクシク素数列 十進BASIC編

『シクシク素数列 Advent Calendar 2018』14日目の記事です。

シクシク素数列を出力するプログラムを十進BASICで実装します。


ルール


  • 数値に4か9を含む素数をシクシク素数と呼ぶことにします


    • 19とか41とか149とか。



  • 標準入力として正の整数 N を与えたら N 番目までのシクシク素数を半角カンマ区切りで標準出力してください


    • 例 N = 9 の場合、 19,29,41,43,47,59,79,89,97



  • 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言語の方が書きやすいです。