朝日新聞2004年6月19日のパズルパーク問題

問題

0を使わない日付が一番連続する日付の最小と最大を求める。

解答への道(ヒント)

0は10日,20日,30日を跨ぐと必ず出現する。これを跨がない可能性があるのは...

と考える前にプログラムを作ってしまい解を出してから,そうかーと上記考え方に気づく。

365日(閏年の場合366日)を順に処理するには

int idays[13] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

を作って以下のループで処理する。

for( int m=1; m<= 12; m++) {
  for( int d=1; d <= idays[m]; d++) {
    // m月d日
  }
}

普通は年の処理があるので,2月を29日にするかどうかを判断しなければならない。今回の問題は年の指定が無いので2月は29日あるものとして考える。

0を含むかどうかは以下のコードで判断する。

char buf[10];
sprintf( buf, "%d%d", m, d);
cstring s=buf;
YesNo ynOK=YES;
while(*s) if(*s++=='0') ynOK=NO;

後は ynOK==YES の場合をカウントアップし,最大が出現する毎に日付を更新する。

Euro2004に備えて今から寝よう(15:00)。

よく考えたら問題はいつからいつまでを求めるので,日数を求めるのでないから,2月が28日か29日かは答えには影響しない。

(2004.07.03)新聞の解答欄では「○月×日〜□月△日の☆日間」とあり,閏年を考慮したあった。

解速度