文章目录
- 1.计算日期到天数转换
- 题目详情
- 代码
- 思路
- 2.KY111 日期差值
- 题目详情
- 代码
- 思路
- 3.KY222 打印日期
- 题目详情
- 代码
- 4.KY258 日期累加
- 题目详情
- 代码
- 思路
1.计算日期到天数转换
传送门
题目详情
代码
#include <iostream>
using namespace std;
int GetDay(int year,int month)
{int DayOfMonth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};if(month==2&&(year%400==0||(year % 4 == 0 && year % 100 )) ){return 29;}return DayOfMonth[month];
}int main() {int year;int month;int day;cin>>year>>month>>day;int sum=0;for(int i=1;i<month;i++){sum+=GetDay(year, i);}cout<<sum+day;
}
思路
首先我们知道肯定是用一个数组来储存每个月的天数,更加方便。同时默认2月是28天,如果是闰年就是29。
总体的计算思路是:1
月到month-1
月的所有天数,加上month
月的day
。使用for循环能正好契合这个思路
当然这题的思路和解法非常多,我这也只是其中一个。
2.KY111 日期差值
传送门
题目详情
代码
int GetDay(int year, int month) {//返回一年中哪一个月的天数int DayOfMonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};if (month == 2 && (year % 400 == 0 || (year % 4 == 0 && year % 100 )) ) {return 29;}return DayOfMonth[month];
}int Sum(int a, int b) {int max = b;int min = a;int flag = 1;if (a > b) {flag = -1;max = a;min = b;}int day1 = min % 100;int month1 = (min / 100) % 100;int year1 = min / 10000;int day2 = max % 100;int month2 = (max / 100) % 100;int year2 = max / 10000;int count = 1;while ((year1 < year2) || (month1 < month2) || (day1 < day2)) {day1++;if (day1 > GetDay(year1, month1)) { //如果满了当月天数month1++;//跳到下一个月,天数变为1号day1 = 1;}if (month1 == 13) { //如果满了当年月数year1++;//跳到下一年,月数变为1月month1 = 1;}count++;}return flag * count;
}int main() {int a, b;while (cin >> a >> b) {cout << Sum(a, b) << endl;}return 0;
}
}
思路
- 首先我们要处理连续输入,之前是使用while(scanf(…)!=EOF)
- 现在也可以,但毕竟是c++。可以用while(cin<<…)
因为:例如上面,当使用 while(cin >> a >> b) 时,如果输入操作成功(即用户输入了两个整数),cin 的布尔值为 true,循环会继续执行。如果输入操作失败(例如遇到文件结束符。在 Windows 中是 Ctrl+Z,Linux/macOS 中是 Ctrl+D。这样程序会结束循环并终止执行),cin 的布尔值为 false,循环会终止
- 思路是找到二者中较小的,再进行拆分。根据只要二者不相等,day1(较小的)就++;天数满了,月满了再进行处理。每一次count++。
3.KY222 打印日期
传送门
题目详情
代码
#include <iostream>
using namespace std;int main() {int year, sum_day;while (cin >> year >> sum_day) {// 注意 while 处理多个 caseint DayOfMonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};if (year % 400 == 0 || (year % 4 == 0 && year % 100 )) {DayOfMonth[2]++;}int month=1;while(sum_day>DayOfMonth[month]){sum_day-=DayOfMonth[month];++month;if(sum_day==DayOfMonth[month]){++month;sum_day=1;break;}}printf("%d-%02d-%02d",year,month,sum_day);}
}
4.KY258 日期累加
传送门
题目详情
代码
#include <cfloat>
#include <iostream>
using namespace std;
int GetDay(int year, int month) //返回一年中哪一个月的天数
{int DayOfMonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};if (month == 2 && (year % 400 == 0 || (year % 4 == 0 && year % 100 )) ) {return 29;}return DayOfMonth[month];
}int main() {int num;cin>>num;while (num--) {int year, month, day,add_day;cin >> year >> month >> day>>add_day;while(add_day--){++day;if (day > GetDay(year, month)){++month;day=1;}if(month==13){year++;month=1;} }printf("%d-%02d-%02d\n",year,month,day);}return 0;}
思路
这题大家要注意题目的输入和输出要求,我自己在这上面浪费了好多多少。
今天就到这里啦!