目录
1. 日期累加
题目描述
输入
输出
代码
2. 日期差值
题目描述
输入
输出
代码
3. 打印日期
题目描述
输入
输出
代码
写在最后:
1. 日期累加
题目链接:日期累加
题目描述
输入
- 1
- 2008 2 3 100
输出
2008-05-13
代码
- #include <iostream>
- using namespace std;
-
- //打表
- int month[] = {0, 31, 28, 31, 30, 31, 30, 31 , 31, 30, 31, 30, 31};
-
- //取当月日期
- int get_mday(int year, int mon) {
- if(mon == 2 && ((year % 4 == 0 && year % 100) || year % 400 == 0)) return month[mon] + 1;
- else return month[mon];
- }
-
- //具体实现
- void plus_day(int& year, int& mon, int& day, int plus) {
- day += plus;
- while (day > get_mday(year, mon)) {
- int mday = get_mday(year, mon);
- if(day > mday) {
- day -= mday;
- mon++;
- }
- if(mon > 12) {
- mon -= 12;
- year++;
- }
- }
- }
-
- int main()
- {
- int n;
- cin >> n;
- while(n--) {
- int year, mon, day, plus;
- cin >> year >> mon >> day >> plus;
- //将日期加在一起
- plus_day(year, mon, day, plus);
- printf("%02d-%02d-%02d\n", year, mon, day);
- }
- return 0;
- }
2. 日期差值
题目链接:日期差值
题目描述
输入
- 20110412
- 20110422
输出
11
代码
- #include <iostream>
- using namespace std;
-
- //打表
- int month[] = {0, 31, 28, 31, 30, 31, 30, 31 , 31, 30, 31, 30, 31};
-
- //判断闰年
- bool is_leap(int year) {
- if((year % 4 == 0 && year % 100) || year % 400 == 0) return true;
- else return false;
- }
-
- int main()
- {
- int n1, n2;
- while (cin >> n1 >> n2) {
- //保证之后的代码时小的日期减大的日期
- if(n1 > n2) swap(n1, n2);
- else if(n1 == n2) {
- cout << 2 <<endl; //题目要求连续日期算两天
- return 0;
- }
-
- //取出年月日
- int year1 = n1 / 10000, year2 = n2 / 10000;
- int mon1 = n1 / 100 % 100, mon2 = n2 / 100 % 100;
- int day1 = n1 % 100, day2 = n2 % 100;
- int ans = 0;
-
- //年份差了几天
- while(year1 != year2) {
- if(is_leap(year1)) ans += 366;
- else ans += 365;
- year1++;
- }
-
- //月份差了几天
- while(mon1 != mon2) {
- if(mon1 < mon2) {
- if(mon1 == 2 && is_leap(year1)) ans += month[mon1] + 1;
- else ans += month[mon1];
- mon1++;
- }
- else {
- if(mon1 == 2 && is_leap(year1)) ans -= month[mon1] + 1;
- else ans -= month[mon1];
- }
- }
-
- //日期差了几天
- if(day1 < day2) {
- ans += day2 - day1;
- }
- else {
- ans -= day1 - day2;
- }
-
- cout << ans + 1 << endl;
- }
- return 0;
- }
3. 打印日期
题目链接:打印日期
题目描述
输入
- 2000 3
- 2000 31
- 2000 40
- 2000 60
- 2000 61
- 2001 60
输出
- 2000-01-03
- 2000-01-31
- 2000-02-09
- 2000-02-29
- 2000-03-01
- 2001-03-01
代码
- #include <iostream>
- using namespace std;
-
-
- //打表
- int month[] = {0, 31, 28, 31, 30, 31, 30,31, 31, 30, 31, 30, 31};
-
- //求当月日期
- int get_mday(int year, int mon) {
- if(mon == 2 && ((year % 4 == 0 && year % 100) || year % 400 == 0)) return month[mon] + 1;
- else return month[mon];
- }
-
- int main()
- {
- int year, day;
- while (cin >> year >> day) {
- int mon = 1;
- while (day > get_mday(year, mon)) {
- day -= get_mday(year, mon);
- mon++;
- if(mon > 12) {
- mon -= 12;
- year++;
- }
- }
- printf("%02d-%02d-%02d\n", year, mon, day);
- }
- return 0;
- }
总结:
日期类的题目大同小异,
把日期类的基本思路练熟了,基本上是能够稳拿这一部分的分数的,
如果你的日期类还不熟练,赶快拿上面几道题练一练手吧!
写在最后:
以上就是本篇文章的内容了,感谢你的阅读。
如果喜欢本文的话,欢迎点赞和评论,写下你的见解。
如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。
之后我还会输出更多高质量内容,欢迎收看。
文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览45066 人正在系统学习中