南邮 OJ 1596 日历

日历

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 422            测试通过 : 80 

比赛描述

 在我们现在使用的日历中, 闰年被定义为能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它们不是闰年。例如:1700, 1800, 1900 和 2100 不是闰年,而 1600, 2000和2400是闰年。

给定从公元1900年1月1日开始逝去得天数,你的任务是给出这一天是哪年哪月哪日星期几。



输入

输入包含若干行,每行包含一个正整数,表示从1900年1月1日开始逝去的天数。输入最后一行是−1, 不必处理。可以假设结果的年份不会超过9999。

输出

对每个测试样例,输出一行,该行包含对应的日期和星期几。格式为“YYYY.MM.DD DayOfWeek”, 其中 “DayOfWeek” 必须是下面中的一个:“Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday” and “Saturday”。

样例输入

40163
8000
17500
2371
-1

样例输出

2009.12.18 Friday
1921.11.27 Sunday
1947.12.1 Monday
1906.6.30 Saturday

提示

 

题目来源

NUPT






#include<iostream>

char w[7][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int monthDay[12]={31,28,31,30,31,30,31,31,30,31,30,31};
bool isLeapYear(int n){
	if(n%4 || !(n%100) && n%400){
		return 0;
	}
	return 1;
}

void printDate(int n){
	int year,month,day;
	year = 1900;
	n++;
	while(n>366){
		if(isLeapYear(year)){
			n -= 366;
		}else{
			n -= 365;
		}
		year++;
	}
	if(!isLeapYear(year) && n>365){
		n -= 365;
		year++;
	}
	if(isLeapYear(year)){
		monthDay[1] = 29;
	}else{
		monthDay[1] = 28;
	}
	for(month=0;month<12;month++){
		if(n>monthDay[month]){
			n -= monthDay[month];
		}else{
			day = n;
			break;
		}
	}
	printf("%d.%d.%d",year,month+1,day);
}

int main(){
//	freopen("test.txt","r",stdin);
	int n;
	while(scanf("%d",&n) && n!=-1){
		printDate(n);
		printf(" %s\n",w[(n+1)%7]);
	}
}


你可能感兴趣的:(ACM,日历,南邮OJ)