2020年1月29日 星期三

a263: 日期差幾天

題目連結

(算日期的題目都好麻煩....把我的解法分享,希望能幫到其他同樣抓狂的人)

解法:
首先,我是參考這份講義中提供的想法(章節3.3.2),把從西元元年到所求日期的總天數分別加起來後,相減即是答案。

判斷閏年照定義做。

計算天數的詳細流程:
1.先算出從元年到(y-1)年的天數。全當作平年計算是因為相減後會相消,不影響。
(真的不影響嗎?其實我不是很清楚,但反正有對)
2.再來找出有幾個閏年。因為閏年比平年天數多1,所以求出有n個閏年則總天數多n。
3.再計算第y年的天數。先算m個月的天數,如果超過二月且當年是閏年則多加1。然後加上d。

其他就很簡單了。


程式碼:AC (4ms, 64KB)
#include <stdio.h>
int isleap(int year)
{
    if((year%400==0)||((year%100!=0)&&(year%4==0)))
        return 1;
    return 0;
}
int countdaysum(int y,int m,int d)
{
    int dayofmonth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int sum=(y-1)*365;
    sum+=(y-1)/4;
    sum-=(y-1)/100;
    sum+=(y-1)/400;
    for(int i=1;i<m;i++)
        sum+=dayofmonth[i];
    if(m>2&&isleap(y))
        sum++;
    sum+=d;
    return sum;
}
int main()
{
    int y1,m1,d1,y2,m2,d2;
    while(scanf("%d %d %d %d %d %d",&y1,&m1,&d1,&y2,&m2,&d2)!=EOF)
    {
        int sum1,sum2;
        sum1=countdaysum(y1,m1,d1);
        sum2=countdaysum(y2,m2,d2);
        if(sum1>sum2)
            printf("%d\n",sum1-sum2);
        else
            printf("%d\n",sum2-sum1);
    }
    return 0;
}

沒有留言:

張貼留言