解いた問題のソースコードと解説など。


POJ 2080 Calendar

問題

2000年1月1日からの経過日数が与えられる。何年何月何曜日か出力せよ。

やりかた

2000年からはじめて、その年の日数を計上していき与えられた数を超える年が答えとなる年。(コードでは数から日数を引いていき0以下になるとこで止めている)
で、与えられた数字-直前の年まで計上した日数が、答えとなる年の元日からの経過日数。
月の決め方も年の決め方と同じようにやればいい。

以下ソース。

bool leap(int y){
  return y % 400 == 0 || (y % 100 != 0 && y % 4 == 0);   
}

int main(int argc, char **argv){
  int N;
  string day[7] = {"Friday","Saturday", "Sunday", "Monday", "Tuesday", 
		   "Wednesday", "Thursday"};
  int days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
  while(cin >> N, N >= 0){
    N++;
    int T = N;
    int year = 2000;

    int total = leap(year) ? 366 : 365;
    while(N - total > 0){
      N -= total;
      year++;
      total = leap(year) ? 366 : 365;
    }
  
    int mon = 1;
    for(mon = 1; mon <= 12; mon++){
      int d = (mon == 2 && leap(year)) ? 29 : days[mon - 1];
      if(N <= d) break;
      N -= d;
    }
    printf("%d-%02d-%02d %s\n", year, mon, N, day[T%7].c_str());
  }
}

SRMのpractice roomに入れないのでお茶濁し。

しょげないでよBaby 眠れば治る