题目链接:http://poj.org/problem?id=2080
解题时间:2013/4/10
所用知识点:①、普通年能整除4且不能整除100的为闰年。(如2004年就是闰年,1900年不是闰年)
②、世纪年能整除400的是闰年。(如2000年是闰年,1900年不是闰年)
源代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char week[7][10]= {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday","Saturday"};
int day1[12]= {31,59,90,120,151,181,212,243,273,304,334,365};
int day2[12]= {31,60,91,121,152,182,213,244,274,305,335,366};
int t_week;
int t_year;
int t_month;
int t_day;
int days;
int total;
int left=0;
int leapYear = 0;//当前年是否为闰年,1表示是闰年
while(scanf("%d",&days),days!=-1)
{
total=-1;
t_week=days%7;
if(t_week==0)t_week=7;//星期
int i=2000;
while(i<=9999)
{
if((i%100!=0)||(i%400==0)) total+=366;
else total+=365;
i++;
if(total>=days) break;
i++;
if((total+=365)>=days) break;
i++;
if((total+=365)>=days) break;
i++;
if((total+=365)>=days) break;
}
i--;
if(((i%4==0)&&(i%100!=0))||(i%400==0))
{
total-=366;
leapYear=1;
}
else
{
total-=365;
leapYear=0;
}
t_year=i;//年
left=days-total;
i=0;
if(leapYear==0)
{
while(left>day1[i++]);
t_month=i;
if(t_month==1) t_day=left;
else t_day=left-day1[t_month-2];
}
else
{
while(left>day2[i++]);
t_month=i;
if(t_month==1) t_day=left;
else t_day=left-day2[t_month-2];
}
printf("%d-%02d-%02d %s\n",t_year,t_month,t_day,week[t_week-1]);
}
return 0;
}