#34916: C++ AC 思路解說加詳解


robinlin.su@gmail.com (Robin)

學校 : 國立中央大學附屬中壢高級中學
編號 : 221849
來源 : [61.57.95.237]
最後登入時間 :
2024-01-10 17:35:51
a263. 日期差幾天 -- 板橋高中練習題 | From: [61.63.112.158] | 發表日期 : 2023-04-26 06:04

思路: 將它們轉換為自公元1年1月1日以來的天數,最後再求兩個天數之差就可以得到天數差,具體步驟如下:

1.計算年份差異: 將要計算的日期所在的年份減去公元1年,再乘以365,即為年份差異的天數(先將所有年份天數先視為365天,後面再一齊加回)。
  EX:1024年比公元1年多了1023年,年份差異的天數為(1024-1)*365=373395天。

2.加上閏年天數: 閏年是指西元年份可以被4整除但不能被100整除,或者可以被400整除的年份。EX:要計算在1024年之前的閏年天數,可以將年份減1後再除以4,再減年份減1後再除以100,再加年份減1後再除以400,即可得到之前的閏年總天數。所以西元1024年之前閏年的總天數為 255-10+2 =247天。

3.加上當年的天數: EX:1024年5月1日 = 1月到4月的天數(閏年超過二月要加1))+ 5月的幾天 =>(31+28+31+30+1)+1 = 122 天

4.最後再將上面加總: 1024年5月1日=(1024-1)*365 + (1024-1)/4 - (1024-1)/100 + (1024-1)/400 +122  = 373764天。

 具體程式如下:

#include <iostream>
#include <cmath>
using namespace std;

int days_month[]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};   //先將所有年份每月天數一視同仁,後面再補回

bool leap(int year)
{
    return (year%4==0 && year%100!=0) || year%400==0;   //判斷閏年
}

int days(int year,int month, int day)
{
    for(int i=0;i<month-1;i++)               //5月5日=>i=0~3 =>31 28 31 30 前四個月天數再加5月的幾天 = 125天
        day+=days_month[i];
    if (month>2 && leap(year)) day++;        //如果是閏年且過了2月,還要再加上一天
    return day+365*(year-1)+(year-1)/4-(year-1)/100+(year-1)/400;  //等於當年的天數(days)+年份差異天數+加上閏年天數
}

int main()
{
    int y1,m1,d1,y2,m2,d2;
    while(cin>>y1>>m1>>d1>>y2>>m2>>d2)
    {
      cout<<abs(days(y1,m1,d1)-days(y2,m2,d2))<<endl;
    }
    return 0;
}

 
ZeroJudge Forum