王道机试指南——日期处理
只要把握住这类问题的核心,解决这类问题就不会再有太大的难度。
这类问题的核心思路是:
1)需要构建闰年和平年的二维数组,如:
int months[13][2] = {
{0,0},//占用空位,方便后续程序处理
{31,31},
{28,29},
{31,31},
{30,30},
{31,31},
{30,30},
{31,31},
{31,31},
{30,30},
{31,31},
{30,30},
{31,31},
};
//第一维表示平年,第二维表示闰年
2)如何判断闰年?
如果该年的年份可以被 400整除,并且可以被4整除,但是不能被100整除,则该年是闰年。用代码表示如下:
int run_years (int year){
if (year % 4 == 0 && year %100 != 0 || year % 400 == 0) return 1;
else return 0;
}
这里的函数返回结果很巧妙,如果返回的值是0,那么刚好对应上述months二维数组的第一维即平年,如果返回的值是1,刚好对应months二维数组的第二维即闰年。
3)最后关键的是如何得到两个日期之间的总天数
这里我们的思路是让计算机一个一个去数,对的,像人一样一个一个去数两个日期之间相隔多少天。
完整的代码如下:
#include<iostream>
#include<string>
using namespace std;
int months[13][2] = {
{0,0},
{31,31},
{28,29},
{31,31},
{30,30},
{31,31},
{30,30},
{31,31},
{31,31},
{30,30},
{31,31},
{30,30},
{31,31},
};
int run_years (int year){
if (year % 4 == 0 && year %100 != 0 || year % 400 == 0) return 1;
else return 0;
}
int main(){
int number1,number2;
cin >> number1 >> number2;
int year1 = number1 / 10000;
int month1 = number1 %10000 / 100;
int day1 = number1 % 100;
int year2 = number2 / 10000;
int month2 = number2 %10000 / 100;
int day2 = number2 % 100;
int ans = 1;
while(year1 < year2 || month1 < month2 || day1 < day2){
day1++;
if (day1 == months[month1][run_years(year1)]+1){
month1++;
day1 = 1;
}
if (month1 == 13){
month1 = 1;
year1++;
}
ans++;
}
cout << ans;
}