学校算法作业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 }
View Code

算法不易,诸位君共勉!

posted @ 2019-10-29 15:12  秦_殇  阅读(277)  评论(0编辑  收藏  举报