天天看點

14-求兩個日期之間的天數

需要考慮的細節比較多,例如:

1、是否同一年

2、是否同一月

3、是否為閏年

4、是否有2月

#include <iostream>

using namespace std;

int month[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};

int main()
{
    int y1,m1,d1,y2,m2,d2;
    int res = 0;
    cin>>y1>>m1>>d1>>y2>>m2>>d2;
    if(y1 == y2)
    {
        if(m1 == m2)                    //同年同月日期相減
            res += d2-d1+1;
        else                            //同年不同月
        {
            for(int m=m1;m<m2;m++)    //先求m1和m2之間天數,含m1不含m2
            {
                if(m == 2)            //存在2月就判斷是否加1
                {
                    if((y1%4 == 0 && y1%100 != 0) || y1%400 == 0)
                        res += 1;
                }
                res += month[m];
            }
            res = res-d1+1;      //将m1中天數減掉
            res += d2;                  //再加m2天數
        }
    }
    else
    {//不同年,先求中間年的天數
        for(int y=y1+1;y<y2;y++)
        {
            if((y%4 == 0 && y%100 != 0) || y%400 == 0)  //如果中間有閏年,多加一天
                res += 1;
            res += 365;
        }
        //求y1年剩餘天數,注意從m1開始算
        for(int m=m1;m<=12;m++)
        {
            if(m == 2)
            {
                if((y1%4 == 0 && y1%100 != 0) || y1%400 == 0)
                    res += 1;
            }
            res += month[m];
        }
        res = res-d1+1;             //将d1日期減掉
        //求y2年到d2的天數
        for(int m=1;m<m2;m++)
        {
            if((y2%4 == 0 && y2%100 != 0) || y2%400 == 0)
                res += 1;
            res += month[m];
        }
        res += d2;
    }
    cout<<res<<endl;
    return 0;
}
           

(感謝西交wrong學長提供以上題目練習)