朝日新聞2004年7月17日パズルパーク(W)解答

プログラムの実行結果は以下の通り。

Find 4567

プログラムのソースは以下の通り。

#include "puzutl.h"

YesNo checknum( int n)
{
  if( n < 1000) return NO; // 4桁限定
  int a = ( n / 1000) % 10;
  int b = ( n / 100 ) % 10;
  int c = ( n / 10  ) % 10;
  int d = ( n / 1   ) % 10;
  if( abs(a-b) == 1 && abs(b-c) == 1 && abs(c-d) == 1) return YES;
  return    NO;
}

void getprime()
{
#define MAXPRIME 10000
  byte s[MAXPRIME];
  int prime[2000];
  int numprime;
  for( int i=0; i< MAXPRIME; i++) {
    if( i&1) s[i] = 1;
    else s[i] = 0;
  }
  // 素数でない物を除く。
  s[0] = 0;
  s[1] = 0;
  s[2] = 1;
  for( i=3; i< MAXPRIME; i+=2) { // 奇数だけ調べる
    if( s[i]) {
      // 素数が見つかった。
      // 倍数を除去する。
      for( int j=i*2; j< MAXPRIME; j+=i) {
        s[j] = 0;
      }
    }
  }
  // s[i] :1:iは素数
  //       0:iは素数でない
  prime[0] = 2;
  numprime = 1;
  for( i=3; i< MAXPRIME; i+=2) {
    if( s[i]) { prime[numprime++] = i;}
    if( numprime >= (sizeof(prime)/sizeof(int))) break;
  }
  for( i=0; i< numprime; i++) {
    if( checknum( prime[i])) {
      ps( "Find %d\n", prime[i]);
    }
  }
}

int main( int argc, cstring argv[])
{
  getprime();
  return    0;
}