• 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 }
  • 相关阅读:
    如何在Web项目中给没有添加API核心组件添加APIController的帮助页HelpPage
    如何在MVC_WebAPI项目中的APIController帮助页面添加Web测试工具测试
    exception throw in progress runner thread_VS2015中SVN源代码无说明提交异常
    [转]AMBA、AHB、APB、ASB总线简介
    UML和模式应用4:初始阶段(6)--迭代方法中如何使用用例
    UML和模式应用4:初始阶段(5)--用例编写的准则
    startup_MK64F12.s文件解析
    [转] bss段、data段、text段
    [转]GDB-----2.watchpoint
    [转]GDB-----1.GDB概述
  • 原文地址:https://www.cnblogs.com/didideblog/p/7221466.html
Copyright © 2020-2023  润新知