蓝桥杯 第四届C/C++预赛真题(1) 高斯日记(数学题,年份处理)
题目标题: 高斯日记
大数学家高斯有个好习惯:无论如何都要记日记。
他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210
后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?
高斯出生于:1777年4月30日。
在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。
高斯获得博士学位的那天日记上标着:8113
请你算出高斯获得博士学位的年月日。
提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21
请严格按照格式,通过浏览器提交答案。
注意:只提交这个日期,不要写其它附加内容,比如:说明性的文字。
数学题。
这题不难,就是麻烦,考虑好细节,否则差了那么一两天这题就没分了。
注意:出生那天也要算。
解答:1799-07-16
代码(有些臃肿,主要是switch语句,可以用数组代替):
1 #include <iostream>
2 using namespace std;
3 struct Date{
4 int y,m,d;
5 };
6 bool run(int y)
7 {
8 if(y%100==0 && y%400==0)
9 return true;
10 if(y%4==0)
11 return true;
12 return false;
13 }
14 Date f(Date birthday,int lastday) //参数为出生日期和持续天数,输出lastday天之后的日期
15 {
16 int y = birthday.y;
17 int m = birthday.m;
18 int d = birthday.d;
19 lastday--; //出生那天也算
20 int last = lastday;
21
22 while(last){ //剩余天数
23 if(last==lastday){ //出生那年
24 int rday=0; //存储如果是闰年多出的那一天
25 if(run(y)) ++rday; //是闰年
26 switch(m){
27 case 1:
28 last-=(31-d)+334+rday;
29 break;
30 case 2:
31 last-=(28+rday-d)+306;
32 break;
33 case 3:
34 last-=(31-d)+275;
35 break;
36 case 4:
37 last-=(30-d)+245;
38 break;
39 case 5:
40 last-=(31-d)+214;
41 break;
42 case 6:
43 last-=(30-d)+184;
44 break;
45 case 7:
46 last-=(31-d)+153;
47 break;
48 case 8:
49 last-=(31-d)+122;
50 break;
51 case 9:
52 last-=(30-d)+92;
53 break;
54 case 10:
55 last-=(31-d)+61;
56 break;
57 case 11:
58 last-=(30-d)+31;
59 break;
60 case 12:
61 last-=(31-d);
62 break;
63 default:break;
64 }
65 y++;
66 }
67 else if(run(y) && last>366){ //当前年份是闰年且剩余天数还有一年以上
68 last-=366;
69 y++;
70 }
71 else if(!run(y) && last>365){ //当前年份不是闰年且剩余天数还有一年以上
72 last-=365;
73 y++;
74 }
75 else{ //剩余天数不到1年
76 int rday=0; //存储如果是闰年多出的那一天
77 if(run(y)) ++rday; //是闰年
78
79 if(1<=last && last<=31){ //1月
80 m=1;
81 d=last;
82 }
83 else if(32<=last && last<=59+rday){ //2月
84 m=2;
85 d=last-31;
86 }
87 else if(60+rday<=last && last<=90+rday){ //3月
88 m=3;
89 d=last-59-rday;
90 }
91 else if(91+rday<=last && last<=120+rday){ //4月
92 m=4;
93 d=last-90-rday;
94 }
95 else if(121+rday<=last && last<=151+rday){ //5月
96 m=5;
97 d=last-120-rday;
98 }
99 else if(152+rday<=last && last<=181+rday){ //6月
100 m=6;
101 d=last-151-rday;
102 }
103 else if(182+rday<=last && last<=212+rday){ //7月
104 m=7;
105 d=last-181-rday;
106 }
107 else if(213+rday<=last && last<=243+rday){ //8月
108 m=8;
109 d=last-212-rday;
110 }
111 else if(244+rday<=last && last<=273+rday){ //9月
112 m=9;
113 d=last-243-rday;
114 }
115 else if(274+rday<=last && last<=304+rday){ //10月
116 m=10;
117 d=last-273-rday;
118 }
119 else if(305+rday<=last && last<=334+rday){ //11月
120 m=11;
121 d=last-304-rday;
122 }
123 else if(335+rday<=last && last<=365+rday){ //12月
124 m=12;
125 d=last-334-rday;
126 }
127 last=0;
128 }
129 }
130 Date date;
131 date.y = y;
132 date.m = m;
133 date.d = d;
134 return date;
135 }
136 int main()
137 {
138 Date birthday,date;
139 birthday.y = 1777;
140 birthday.m = 4;
141 birthday.d = 30;
142
143 int lastday = 8113;
144 date = f(birthday,lastday); //获得lastday天之后的日期
145 cout<<date.y<<'-';
146 if(date.m/10==0)
147 cout<<'0'<<date.m<<'-'<<date.d<<endl;
148 else
149 cout<<date.m<<'-'<<date.d<<endl;
150 return 0;
151 }
Freecode : www.cnblogs.com/yym2013