计算两个日期之间的天数

总时间限制:   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 

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 <

当然因为考试已经完了,考试的时候我没做出来,这会回宿舍写的,也不知道写的对不对,poj上没找到原题提交测试。如有错误,还望指出。

你可能感兴趣的:(计算两个日期之间的天数)