poj2080

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

给定从公元2000年1月1日(周六)开始逝去的天数,你的任务是给出这一天是哪年哪月哪日星期几

输入:
n输入包含若干行,每行包含一个正整数,表示从2000年1月1日开始逝去的天数。输入最后一行是−1, 不必处理。可以假设结果的年份不会超过9999。
输出:
n对每个测试样例,输出一行,该行包含对应的日期和星期几。
n格式为“YYYY-MM-DD DayOfWeek”, 其中 “DayOfWeek” 必须是下面中的一个: "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" and "Saturday“。
样例输入

1730

1740

1750

1751

-1 

样例输出

2004-09-26 Sunday

2004-10-06 Wednesday

2004-10-16 Saturday

2004-10-17 Sunday

 1 #include<stdio.h>
 2 
 3 char a[7][10]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
 4 int y,m,d,n;
 5 
 6 int p(int n)
 7 {
 8     if(n%4==0&&n%100!=0||n%400==0)  return 1;
 9     else return 0;
10 }
11 
12 void fun()
13 {
14     int v;
15     for(y=2000,d=0;d<=n;y++)
16     {
17         if(p(y)) d+=366;
18         else d+=365;
19     }
20     y--;
21     if(p(y)) d-=366;
22     else d-=365;
23 
24     m=1;
25     if(p(y)) v=29;
26     else v=28;
27     while(d<=n)
28     {
29         switch(m++)
30         {
31         case 1:
32         case 3:
33         case 5:
34         case 7:
35         case 8:
36         case 10:
37         case 12:d+=31;break;
38         case 2:d+=v;break;
39         default:d+=30;
40         }
41     }
42     m--;
43     switch(m)
44     {
45         case 1:
46         case 3:
47         case 5:
48         case 7:
49         case 8:
50         case 10:
51         case 12:d-=31;break;
52         case 2:d-=v;break;
53         default:d-=30;
54     }
55 //    m--;
56 
57     d=n-d+1;
58     printf("%d-%02d-%02d ",y,m,d);
59 }
60 
61 int main()
62 {
63     while(scanf("%d",&n),n!=-1)
64     {
65         fun();
66         if(m<3)
67         {
68             y--;
69             m+=12;
70         }
71         printf("%s\n",a[(d+2*m+3*(m+1)/5+y+y/4+y/400-y/100)%7]);
72     }
73     return 0;
74 }
原文地址:https://www.cnblogs.com/xiaofanke/p/3045408.html