学校算法作业X——(日期问题)
最近一直在忙项目,难得有时间写一下作业,所以断了,现在赶紧续上
题目如下:
日历问题
问题描述
在我们现在使用的日历中, 闰年被定义为能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它们不是闰年。例如:1700, 1800, 1900 和 2100 不是闰年,而 1600, 2000 和 2400是闰年。给定从公元2000年1月1日开始逝去的天数,你的任务是给出这一天是哪年哪月哪日星期几。
输入数据
输入包含若干行,每行包含一个正整数,表示从2000年1月1日开始逝去的天数。输入最后一行是?1, 不必处理。可以假设结果的年份不会超过9999。
输出要求
对每个测试样例,输出一行,该行包含对应的日期和星期几。格式为“YYYY-MM-DD DayOfWeek”, 其中 “DayOfWeek” 必须是下面中的一个:
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" 或 "Saturday“。
输入样例
1730
1740
1750
1751
-1
输出样例
2004-09-26 Sunday
2004-10-06 Wednesday
2004-10-16 Saturday
2004-10-17 Sunday
不贴图片le。
这道题就是简单的日期计算模拟,先算出2000 - 1- 1 是星期几,再一年一年的加到那一年,加了多少就在逝去的日子里减去多少。噢,记得判断闰年。
这里顺手给大家贴一个简洁的闰年判断函数(三目运算)
int leapyear(int year) { return (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) ? 1 : 0; }
到了这一年,那就一个个月加,在总日期处一点点,完事。哦,在逝去的日子的总数小于月份的时候停下来。余下来的日子+1就是日。
贴代码:
自己先试试
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 const char *days[] = {"Sunday", "Monday", "Tuesday", 5 "Wednesday", "Thursday", "Friday", 6 "Saturday"}; 7 const int MounthDays[] = {0, 8 31, 28, 31, 30, 9 31, 30, 31, 31, 10 30, 31, 30, 31}; 11 12 int leapyear(int PastDay); 13 14 int main(void) 15 { 16 int PastDay; 17 while (~scanf("%d", &PastDay) && PastDay != -1) 18 { 19 int StartYear = 2000; 20 int StartMonth = 1; 21 int StartWeek = (PastDay + 6) % 7; 22 23 /* 一年一年过 */ 24 while (1) 25 { 26 int ydays = 365 + leapyear(StartYear); 27 if (PastDay >= ydays) 28 { 29 PastDay -= ydays; 30 StartYear++; 31 } 32 else 33 { 34 break; 35 } 36 } 37 38 /* 一个月一个月过 */ 39 while (1) 40 { 41 int day2 = (StartMonth == 2 ? MounthDays[StartMonth] + leapyear(StartYear) : MounthDays[StartMonth]); 42 if (PastDay >= day2) 43 { 44 PastDay -= day2; 45 StartMonth++; 46 } 47 else 48 { 49 break; 50 } 51 } 52 53 printf("%d-%02d-%02d %s\n", StartYear, StartMonth, PastDay + 1, days[StartWeek]); 54 } 55 56 return 0; 57 } 58 59 int leapyear(int PastDay) 60 { 61 return (((PastDay % 4 == 0) && (PastDay % 100 != 0)) || (PastDay % 400 == 0)) ? 1 : 0; 62 }
算法不易,诸位君共勉!