日期的处理 - 高斯日记 - 端午节 - 计算日期后续
2016-06-12 02:12
741 查看
问题 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<cstdio> #include<cmath> #include<cstring> #include<iostream> #include<iomanip> #include<cstdlib> #include<algorithm> #include<string> #include<vector> #include<queue> #include<stack> #include<set> #include<list> 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; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- oracle sql日期比较
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- DB2 日期和时间的函数应用说明
- Delphi实现读取系统时间与日期完整实例
- Country使 MS-DOS 子系统能使用国际时间、日期、货币、大小写转换和小数分隔符
- vbs下通过日期查找文件夹的代码
- 用批处理实现的创建带日期的文件夹的代码
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- asp格式化日期时间格式的代码
- sql server动态存储过程按日期保存数据示例
- SqlServer中的日期与时间函数
- Oracle 日期的一些简单使用
- C++联合体转换成C#结构的实现方法
- C#验证给定字符串形式日期是否合法的方法
- C++高级程序员成长之路