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 处理多个 case int 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; }
思路
这题大家要注意题目的输入和输出要求,我自己在这上面浪费了好多多少。