AtCoder Regular Contest #002 B : 割り切れる日付

問題概要

指定された日以降で、年が(月*日)で割りきれる最初の日付を求める問題。

解法

一日ずつ進める。1日でダメだったら次の月に行くとか、年をまたいだら無条件でOKとかいろいろあるけど、どうせ間に合うのだから余計なことはせず愚直にやってOK。

acceptされたコード

import std.stdio;

int Y, M, D;

immutable days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

void init(){
	scanf("%d/%d/%d", &Y, &M, &D);
	--M;
	--D;
}

bool is_leap(int y){
	if(y % 400 == 0){
		return true;
	}
	if(y % 100 == 0){
		return false;
	}
	return y % 4 == 0;
}

bool is_dividable(int y, int m, int d){
	return y%((m+1)*(d+1)) == 0;
}

void solve(){
	for(;;){
		if( is_dividable(Y, M, D) ){
			break;
		}
		++D;
		if(M == 1 && D == 28){
			if(is_leap(Y)){
				continue;
			}
			else{
				D = 0;
				++M;
				continue;
			}
		}
		
		if(days[M] <= D){
			D = 0;
			++M;
			if( M == 12 ){
				M = 0;
				++Y;
			}
		}
	}
	print(Y, M+1, D+1);
}

void print(int y, int m, int d){
	writefln("%04d/%02d/%02d", y, m, d);
}

void main(){
	init;
	solve;
}