您的位置:首页 > 编程语言 > C语言/C++

蓝桥杯 第四届C/C++预赛真题(1) 高斯日记(数学题,年份处理)

2014-03-17 18:14 507 查看
题目标题: 高斯日记

大数学家高斯有个好习惯:无论如何都要记日记。

他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210

后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?

高斯出生于:1777年4月30日。

在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。

高斯获得博士学位的那天日记上标着:8113

请你算出高斯获得博士学位的年月日。

提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21

请严格按照格式,通过浏览器提交答案。
注意:只提交这个日期,不要写其它附加内容,比如:说明性的文字。

  数学题。

  这题不难,就是麻烦,考虑好细节,否则差了那么一两天这题就没分了。

  注意:出生那天也要算。

  解答:1799-07-16

  代码(有些臃肿,主要是switch语句,可以用数组代替):

#include <iostream>
using namespace std;
struct Date{
int y,m,d;
};
bool run(int y)
{
if(y%100==0 && y%400==0)
return true;
if(y%4==0)
return true;
return false;
}
Date f(Date birthday,int lastday)    //参数为出生日期和持续天数,输出lastday天之后的日期
{
int y = birthday.y;
int m = birthday.m;
int d = birthday.d;
lastday--;    //出生那天也算
int last  = lastday;

while(last){    //剩余天数
if(last==lastday){    //出生那年
int rday=0;        //存储如果是闰年多出的那一天
if(run(y)) ++rday;    //是闰年
switch(m){
case 1:
last-=(31-d)+334+rday;
break;
case 2:
last-=(28+rday-d)+306;
break;
case 3:
last-=(31-d)+275;
break;
case 4:
last-=(30-d)+245;
break;
case 5:
last-=(31-d)+214;
break;
case 6:
last-=(30-d)+184;
break;
case 7:
last-=(31-d)+153;
break;
case 8:
last-=(31-d)+122;
break;
case 9:
last-=(30-d)+92;
break;
case 10:
last-=(31-d)+61;
break;
case 11:
last-=(30-d)+31;
break;
case 12:
last-=(31-d);
break;
default:break;
}
y++;
}
else if(run(y) && last>366){    //当前年份是闰年且剩余天数还有一年以上
last-=366;
y++;
}
else if(!run(y) && last>365){    //当前年份不是闰年且剩余天数还有一年以上
last-=365;
y++;
}
else{    //剩余天数不到1年
int rday=0;        //存储如果是闰年多出的那一天
if(run(y)) ++rday;    //是闰年

if(1<=last && last<=31){    //1月
m=1;
d=last;
}
else if(32<=last && last<=59+rday){    //2月
m=2;
d=last-31;
}
else if(60+rday<=last && last<=90+rday){    //3月
m=3;
d=last-59-rday;
}
else if(91+rday<=last && last<=120+rday){    //4月
m=4;
d=last-90-rday;
}
else if(121+rday<=last && last<=151+rday){    //5月
m=5;
d=last-120-rday;
}
else if(152+rday<=last && last<=181+rday){    //6月
m=6;
d=last-151-rday;
}
else if(182+rday<=last && last<=212+rday){    //7月
m=7;
d=last-181-rday;
}
else if(213+rday<=last && last<=243+rday){    //8月
m=8;
d=last-212-rday;
}
else if(244+rday<=last && last<=273+rday){    //9月
m=9;
d=last-243-rday;
}
else if(274+rday<=last && last<=304+rday){    //10月
m=10;
d=last-273-rday;
}
else if(305+rday<=last && last<=334+rday){    //11月
m=11;
d=last-304-rday;
}
else if(335+rday<=last && last<=365+rday){    //12月
m=12;
d=last-334-rday;
}
last=0;
}
}
Date date;
date.y = y;
date.m = m;
date.d = d;
return date;
}
int main()
{
Date birthday,date;
birthday.y = 1777;
birthday.m = 4;
birthday.d = 30;

int lastday = 8113;
date = f(birthday,lastday);    //获得lastday天之后的日期
cout<<date.y<<'-';
if(date.m/10==0)
cout<<'0'<<date.m<<'-'<<date.d<<endl;
else
cout<<date.m<<'-'<<date.d<<endl;
return 0;
}


Freecode : www.cnblogs.com/yym2013
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: