总时间限制: 1000ms 内存限制: 65536kB
描述
给定两个日期,计算相差的天数。比如2010-1-1和2010-1-3相差2天。
输入
共两行:
第一行包含三个整数startYear,startMonth,startDay,分别是起始年、月、日。
第二行包含三个整数endYear,endMonth,endDay,分别是结束年、月、日。
相邻两个整数之间用单个空格隔开。
年份范围在1~3000。保证日期正确且结束日期不早于起始日期。输出
输出一个整数,即是两个日期相差的天数。
样例输入
2008 1 1 2009 1 1样例输出
366提示
闰年被定义为能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它们不是闰年。闰年的2月份有29天。
本题主要的难点在于需要分情况讨论。
首先需要讨论起止年是否在同一年,如果是在同一年,则还需要讨论其起止月是否包含2月;如果起止年不在同一年,则需要讨论起始年月份在2月前和2月后,以及终止年月份在2月前和2月后。
具体代码如下:
#include <iostream>
using namespace std;
bool isLeap(int x)
{
if(x % 4 == 0 && ! (x % 400 != 0 && x % 100 == 0))
{
return true;
}
return false;
}
int month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main(){
int startYear, startMonth, startDay;
int endYear, endMonth, endDay;
cin >> startYear >> startMonth >> startDay;
cin >> endYear >> endMonth >> endDay;
int ans = 0;
//如果是同一年
if(startYear == endYear)
{
if(startMonth == endMonth)
{
ans = endDay - startDay;
}
else
{
for(int i = startMonth + 1; i < endMonth; i ++)
{
ans += month[i];
}
ans += month[startMonth] - startDay + endDay;
//如果是闰年
if(isLeap(startYear))
{
//判断起止月是否包含2月
if(startMonth <= 2 && endMonth > 2)
{
ans += 1;
}
}
}
}
else
{
//计算两个年份之间年份的总天数
for(int i = startYear + 1; i < endYear; i ++)
{
ans += 365;
if(isLeap(i))
ans += 1;
}
//计算起始年份的总天数
for(int i = startMonth + 1; i <= 12; i ++)
{
ans += month[i];
}
ans += month[startMonth] - startDay;
//特殊判断起始月份如果在2月之前(包括2月),在闰年的情况下,天数需要加1
if(isLeap(startYear))
{
if(startMonth <= 2)
{
ans += 1;
}
}
//计算终止年份的天数
for(int i = 1; i < endMonth; i ++)
{
ans += month[i];
}
ans += endDay;
//特殊判断终止月份如果在2月之后(不包括2月),在闰年的情况下,天数需要加1
if(isLeap(endYear))
{
if(endMonth > 2)
{
ans += 1;
}
}
}
cout <<ans <<endl;
return 0;
}
当然因为考试已经完了,考试的时候我没做出来,这会回宿舍写的,也不知道写的对不对,poj上没找到原题提交测试。如有错误,还望指出。
该博客介绍了一个计算两个日期之间相差天数的问题,涉及闰年判断和不同情况的讨论。给出了代码实现,但未进行实际测试,期待读者提供反馈。
510

被折叠的 条评论
为什么被折叠?



