问题 A: 高斯日记
时间限制: 1 Sec 内存限制: 128 MB
题目描述
大数学家高斯有个好习惯:无论如何都要记日记。 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢? 高斯出生于:1777年4月30日。 在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。 高斯获得博士学位的那天日记上标着:8113 请你算出高斯获得博士学位的年月日。输入
输出
提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21
问题 B: 端午节
时间限制: 1 Sec 内存限制: 128 MB
题目描述
2014 年 6 月 2 日是端午节,也是小粽子同学的 18 岁生日。可以推算出小粽子同学出生于星期日,经历了 6575 天(出生当天也算 1 天)。输入
输入一个日期 。输出
输出2 个数。第1个数表示此人从出生到 2014 年 6 月 2 日所经过的天数,第 2 个数表示这个人的出生日期是星期几。样例输入
1975 9 1
样例输出
14155 1
问题 C: 计算后续日期
时间限制: 1 Sec 内存限制: 128 MB
题目描述
我们经常要计算,从今天往后N天之后是哪一天(哪年哪月哪日)。现在我们就可以编写一个程序,推算指定日期之后的第N天是什么日期。
输入
输入有多组。每组测试用例有一行,包括四个整数,分别表示年,月,日和第N天。
输出
对于每组测试用例,输入由一行组成,表示(年月日+N天后的)的年-月-日
样例输入
2012 4 9 91 2013 1 1 364
样例输出
2012-7-9 2013-12-31
这三道题其实可以看作一道题,其核心的需求概括出来可以得到两个函数,即根据天数求日期和根据日期求天数。如下:
#include
#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; int mon[2][12] = { { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } }; int yea[2] = { 365,366 }; int is_leap(int a)//是否是闰年,是则返回1,不是则返回0 { if ((a % 4 == 0 && a % 100 != 0) || a % 400 == 0)return 1; else return 0; } //返回从1年1月1日开始(包括当天)到输入天数(不包括当天)所经历的天数 int get_days(int year, int month, int day) { int sum = 0; for (int i = year; i > 1; i--) { sum += yea[is_leap(i)]; } for (int j = month; j > 1; j--) { sum += mon[is_leap(year)][j - 1]; } sum += day - 1; return sum; } //输入n(n大于0),则返回从1年1月1日(包括当天)开始经过了n天后的日期(不包括当天) void use_days(int sum, int &year, int &month, int &day) { for (year = 1; sum >= yea[is_leap(year)]; year++) { sum -= yea[is_leap(year)]; } for (month = 0; sum >= mon[is_leap(year)][month]; month++) { sum -= mon[is_leap(year)][month]; } month++; day = sum + 1; return; }
得到这两个函数之后各题的主函数就容易得到了,如下:
/////高斯日记 int main() { int year, month, day, n; year = 1777; month = 4; day = 30; n = 8113; n += get_days(year, month, day); use_days(n, year, month, day); cout << year << "-" << month << "-" << day << endl; return 0; } /////端午节 int main() { int year, month, day, n; while (cin >> year >> month >> day) { int a = get_days(year, month, day); int b = get_days(2014, 6, 2); //a+1是因为要包括当天,后来还+1是为了使得第一天为星期一而不是星期零 int week = (a + 1) % 7 + 1; cout << b - a + 1 << endl << week << endl; } return 0; } /////计算后续日期 int main() { int year, month, day, n; while (cin >> year >> month >> day >> n) { n+= get_days(year, month, day); use_days(n, year, month, day); cout << n << endl; cout << year << "-" << month << "-" << day << endl; } return 0; }