zoukankan      html  css  js  c++  java
  • 18岁生日

    问题 D: 18岁生日

    时间限制: 1 Sec  内存限制: 32 MB
    [提交][状态][讨论版]

    题目描述

    zzq18岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出生开始,到达18岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所以他想请你帮忙计算一下他和他的几个朋友从出生到达18岁生日所经过的总天数,让他好来比较一下。

    输入

    输入的第一行是一个数T,后面T行每行有一个日期,格式是YYYY-MM-DD。如我的生日是1988-03-07

    输出

    T行,每行一个数,表示此人从出生到18岁生日所经过的天数。如果这个人没有18岁生日,就输出-1

    样例输入

    1

    1988-03-07

    样例输出

    6574

     

    题意概括:

    算出从出生之日起到十八岁生日经历过的天数。

    解题分析:

    若出生时年份为闰年日期为二月二十九号,并且十八岁生日是刚好也为相同日期时输出-1,其他情况只需判断闰年即可

    测试样例:

    5

    1999-03-23

    2000-05-01

    1970-12-1

    1982-2-29

    1964-2-29

    测试样例输出:

    6575

    6574

    6575

    6574

    -1

     

    代码:

     1 #include<stdio.h>
     2 #include<string.h>
     3 
     4 int a[2][13] = {{0,31,28,31,30,31,30,31,31,30,31,30,31},
     5                 {0,31,29,31,30,31,30,31,31,30,31,30,31}};
     6 
     7 int f(int year)
     8 {
     9     if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
    10         return 1;
    11     return 0;
    12 }
    13 int ff(int year, int m, int day)
    14 {
    15     int j,i,sum=0;
    16     for(i = year; i < year+18; i++){
    17         if(f(i))
    18             sum += 366;
    19         else
    20             sum += 365;
    21     }
    22     if(f(year))
    23         j = 1;
    24     else
    25         j = 0;
    26     for(i = 1; i < m; i++)
    27         sum -= a[j][i];
    28     sum -= day;
    29     if(f(year+18))
    30         j = 1;
    31     else
    32         j = 0;
    33     for(i = 1; i < m; i++)
    34         sum += a[j][i];    
    35     sum += day;
    36     return sum;
    37 }
    38 
    39 int main()
    40 {
    41     int T, n, sum, d, m, y, i, flag;
    42     char str[15];
    43     scanf("%d",&T);
    44     while(T--){
    45         flag = 1;
    46         scanf("%s", str);
    47         for(i = 0, n = 0; str[i]; i++){
    48             if(str[i] == '-'){
    49                 if(flag == 1)
    50                     y = n;
    51                 else if(flag == 2)
    52                     m = n;
    53                 flag++;
    54                 n = 0 ;
    55             }
    56             else
    57                 n = n * 10 + str[i] - '0';
    58         }
    59         d = n;
    60         if(f(y) && m == 2 && d == 29 && !f(y+18)){
    61             printf("-1
    ");
    62             continue;
    63         }
    64         printf("%d
    ", ff(y, m, d));
    65     }
    66     return 0;
    67 }
  • 相关阅读:
    欧拉函数 & 【POJ】2478 Farey Sequence & 【HDU】2824 The Euler function
    【BZOJ】2982: combination(lucas定理+乘法逆元)
    【vijos】1781 同余方程(拓展欧几里得)
    Disillusioning #1 水题+原题赛(被虐瞎)
    【HDU】3622 Bomb Game(2-SAT)
    小结:双连通分量 & 强连通分量 & 割点 & 割边
    【POJ】2942 Knights of the Round Table(双连通分量)
    【POJ】1523 SPF(割点)
    【POJ】1094 Sorting It All Out(拓扑排序)
    小结:网络流
  • 原文地址:https://www.cnblogs.com/didideblog/p/7221466.html
Copyright © 2011-2022 走看看