1. 程式人生 > >杭電1201之18歲生日

杭電1201之18歲生日

Problem Description Gardon的18歲生日就要到了,他當然很開心,可是他突然想到一個問題,是不是每個人從出生開始,到達18歲生日時所經過的天數都是一樣的呢?似乎並不全都是這樣,所以他想請你幫忙計算一下他和他的幾個朋友從出生到達18歲生日所經過的總天數,讓他好來比較一下。

Input 一個數T,後面T行每行有一個日期,格式是YYYY-MM-DD。如我的生日是1988-03-07。

Output T行,每行一個數,表示此人從出生到18歲生日所經過的天數。如果這個人沒有18歲生日,就輸出-1。

Sample Input 1 1988-03-07
Sample Output

6574

分析:

題目本身不難,有一個地方不容易想到,若此人出生時某一年的2月29日,則該年必為閏年,且18年之後不可能為閏年,所以此時沒有18歲生日!!!

AC程式碼如下:

#include "iostream" #include "stdio.h" using namespace std; int
main(int argc, char* argv[]) { int y,m,d; //年月日int i; int n,sum; //sum記錄總天數int a[15]={0,31,29,31,30,31,30,31,31,30,31,30,31}; //閏年的12個月int b[15]={0,31,28,31,30,31,30,31,31,30,31,30,31}; //平年的12個月份cin>>n; while(n--) { scanf("%d-%d-%d",&y,&m,&d); if(m==2&&d==29) //沒有18歲生日的條件{ cout<<-1<<endl;
} else{ sum=0; if (y%400==0||(y%4==0 && y%100!=0)) { sum+=(a[m]-d); for (i=m+1;i<=12;i++) { sum+=a[i]; } for (i=y+1;i<y+18;i++) { if (i%400==0||(i%4==0&&i%100!=0)) { sum+=366; } else{ sum+=365; } } sum+=d; if ((y+18)%400==0||((y+18)%4==0&&(y+18)%100!=0)) { for (i=1;i<m;i++) { sum+=a[i]; }
} else{ for (i=1;i<m;i++) { sum+=b[i]; } } } else{ sum+=(b[m]-d); for (i=m+1;i<=12;i++) { sum+=b[i]; } for (i=y+1;i<y+18;i++) { if (i%400==0||(i%4==0&&i%100!=0)) { sum+=366; } else{ sum+=365; } } sum+=d; if ((y+18)%400==0||((y+18)%4==0&&(y+18)%100!=0)) { for (i=1;i<m;i++) { sum+=a[i]; } } else{ for (i=1;i<m;i++) { sum+=b[i]; } } } cout<<sum<<endl; } } return 0;