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; }