最近一直在忙项目,难得有时间写一下作业,所以断了,现在赶紧续上
题目如下:
日历问题
问题描述
在我们现在使用的日历中, 闰年被定义为能被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
2 #include
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 }
算法不易,诸位君共勉!