2011年10月30日 星期日

a263: 日期差幾天

內容 :
    給你兩個日期,問這兩個日期相差幾天。

輸入說明 :
    輸入有多筆測資,每筆測資有兩行,每行有三個整數依序是年、月、日。輸入以 EOF 作為結束,題目保證不會有不符合的測資出現。

輸出說明 :
    輸出兩個日期差幾天。

範例輸入 :
2011 10 19
2011 10 18

範例輸出 :
1

提示 :
    年份在[0,9999]範圍內

程式碼:
#include <stdio.h>

int monthday[13] = {0,0,31,59,90,120,151,181,212,243,273,304,334};

int calculateDay(int year, int month, int day)
{
    int leaps,isleap;
    
    isleap = (year%4==0 && year%100!=0) || year%400==0;
    
    year--;
    leaps = year/4 - year/100 + year/400;
    
    return (year*365+leaps) + (monthday[month]+((month>2)?isleap:0)) + day;
}

int main ()
{
    int i,year[2],month[2],day[2],check;
  
    while(scanf("%d %d %d",&year[0],&month[0],&day[0])==3)
    {
        scanf("%d %d %d",&year[1],&month[1],&day[1]);
        
        check = calculateDay(year[0],month[0],day[0]) - calculateDay(year[1],month[1],day[1]);
        
        printf("%d\n",check>-1?check:-check);
    }
    
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=a263

7 則留言:

  1. 對不起 我是新手
    請問一下
    check>-1?check:-check
    (month>2)?isleap:0)
    這兩行裡的 "?" 和 ":" 是甚麼意思?


    謝謝

    回覆刪除
  2. 這是三元運算子
    舉個例子 a>0?b:c;
    如果a>0,則輸出b。如果a不大於0,則輸出c

    以printf("%d\n",check>-1?check:-check);為例可以看成
    if(check>-1) printf("%d",check);
    else printf("%d",-check);

    用三元運算子的好處是一行就可以解決上述if else的那2行了。

    回覆刪除
  3. XD有點看不懂>.<
    請問一下 leaps = year/4 - year/100 + year/400; 是要做什麼用的??

    回覆刪除
  4. 您好,請問
    isleap = (year%4==0 && year%100!=0) || year%400==0;

    year--;
    這兩行的用意是甚麼啊?

    先謝謝解答了。

    回覆刪除
    回覆
    1. isleap = (year%4==0 && year%100!=0) || year%400==0;
      上行判斷今年是不是閏年

      year--;
      leaps = year/4 - year/100 + year/400;
      上行兩行主要用意是從0~(year-1)之間有多少個閏年

      刪除