Beyond the State-of-the-Art

最先端を超えたいと思ってる(大嘘)エンジニアのブログ

シクシク素数列 十進BASIC編

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