题目描述
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天
输入描述:
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出描述:
每组数据输出一行,即日期差值
示例1
输入
20110412
20110422
输出
11
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
int daytab[2][13] = {
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
bool IsLeapYear(int year) {
return(year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
}
int NumberOfYear(int year) {
if (IsLeapYear(year)) {
return 366;
}
else {
return 365;
}
}
int main() {
int date[2] = { 0,0 }, day[2] = { 0,0 }, month[2] = { 0,0 }, year[2] = { 0,0 }, number = 0;
while (cin >> date[0] >> date[1]) {
for (int i = 0; i <= 1; ++i) {
day[i] = date[i] % 100;
month[i] = ((date[i] - day[i]) / 100) % 100;
year[i] = (((date[i] - day[i]) / 100) - month[i]) / 100; //按照输入格式计算出年月日
}
if (year[0] < year[1]) {
for (; year[0] < year[1]; year[0]++) {
number += NumberOfYear(year[0]);
}
}
int row = IsLeapYear(year[0]);
if (month[0] < month[1]) {
for (; month[0] < month[1]; ++month[0]) {
number += daytab[row][month[0]];
}
}
else {
for (; month[0] > month[1]; --month[0]) {
number -= daytab[row][month[0]];
}
}
if (day[0] < day[1]) {
number += day[1] - day[0];
}
else {
number -= day[0] - day[1];
}
printf("%d", number+1);
}
return 0;
}
看到的另一种方法,更加简洁(计算两个日期距离0000年0月1日的天数再求差):
#include <bits/stdc++.h>
using namespace std;
int mon[12]={0,31,59,90,120,151,181,212,243,273,304,334};//字典
int cal(int y,int m,int d)//给出年月日,计算距离0000年0月1日的天数和
{
return y*365+y/4-y/100+y/400+mon[m-1]+d-1+(y/100!=0&&y/4==0||y/400==0&&m>2);
}
int main()
{
int x[2],year,month,day;
for(int k=0;k<2;k++)//循环两次读入两个日期
{
scanf("%4d%2d%2d",&year,&month,&day);
x[k]=cal(year,month,day);
}
cout<<abs(x[0]-x[1])+1;
}