予選問題4 解答と解説


正解
    Pascal        place[k] <> place[keta-k+1]
    C             place[k] != plaxe[keta-k-1]
    Quick BASIC   place(k) <> place(keta-k+1)

 プログラムは3つの部分から成り立っている。 まず、手続き(関数)Eratosthenesは、エラトステネスの篩(ふるい)法と 呼ばれるよく知られたアルゴリズムを用いて、 min (MIN=101) と max (MAX=1994)の間にあるすべての整数 について素数であるか否かを調べている (iが素数ならsieve[i]=1、素数でないならsieve[i]=-1とする)。 エラトステネスの篩法では、まず、min〜max間のすべての整数を並べる(i=min〜 maxについてsieve[i]=iとする)。次いで、2を除く2の倍数すべてを消去する (sieve[2の倍数]=-1)。この後、次のことを繰り返す:

 1. 消去されていない最小の数をnとする。
 2. n > (maxの平方根)なら、n以上の消去されずに残った整数はすべて素数であるので終了。
 3. そうでないときはnを残し、nの倍数をすべて消去する。 こうして得られた素数nが回数であるかどうかを判定する論理関数がpalindrome(n) である。空欄箇所はこの中にある。palindrome(n)では、まず、nを1桁1桁に分解 し(Cではplace[keta]にはnの10ketaの位の数が入り、Pascal,\ BASICでは 10keta-1の位の数が入る)、空欄箇所を持っているfor文の中で、こうして 得られた各桁を上位の桁からと下位の桁から1桁ずつ中央の桁に至るまで等しいか 否か調べている。配列の添字が0から始まっているか1から始まっているかの違いで、 Cとそれ以外の言語とでは比較のための式が少し違う。
 最後に、手続き(関数)print_palindromes(n)で、Eratosthenesの結果と palindrome(n)とを用いて、素な回数だけを出力する。