首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

NYOJ 20歲生日:計算出生至 20 歲生日總天數

     編輯:C++ 入門

NYOJ 20歲生日:閏年與日期計算

題目大意

給定出生日期 YYYY-MM-DD,計算從出生到 20 歲生日(即 YYYY+20-MM-DD)經過的總天數。若 20 歲生日不存在(如 2月29日出生但 20 年後非閏年),輸出 -1。

閏年規則

bool leap(int y) {
    return (y%4==0 && y%100!=0) || (y%400==0);
}

計算步驟

  1. 檢查 20 年後同年同月日是否合法(特別是 2月29日)。
  2. 累加 1~19 年的天數(閏年 366,平年 365)。
  3. 加上出生年剩餘天數:leap(y) ? 366 - dayOfYear(y, m, d) : 365 - dayOfYear(y, m, d)。
  4. 加上 20 年生日當年的年內天數:dayOfYear(y+20, m, d)。

關鍵代碼

int monthDay[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int dayOfYear(int y, int m, int d) {
    int sum = 0;
    for (int i=1;i2 && leap(y)) sum++;
    return sum;
}
int main() {
    int T; scanf("%d", &T);
    while (T--) {
        int y,m,d; scanf("%d-%d-%d", &y,&m,&d);
        if (m==2 && d==29 && !leap(y+20)) { puts("-1"); continue; }
        int sum = 0;
        for (int i=1;i<=19;i++) sum += leap(y+i) ? 366 : 365;
        sum += leap(y) ? 366 - dayOfYear(y,m,d) : 365 - dayOfYear(y,m,d);
        sum += dayOfYear(y+20, m, d);
        printf("%d\n", sum);
    }
}

樣例

1988-03-07 → 7305 天。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved