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

    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
     
     1 #include <stdio.h>
     2 
     3 int judge(int x)
     4 {
     5     if(x % 400 == 0 || x % 4 == 0 && x % 100 != 0)
     6         return 1;
     7     else 
     8         return 0;
     9 }
    10 
    11 int main()
    12 {
    13     int md[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    14     int yd[2] = {365, 366};
    15     int year, month, day, sum, n, i;
    16     char s[11];
    17     scanf("%d", &n);
    18     while(n--){
    19 
    20             md[2] = 28;//忘记对md[2]初始化了
    21             scanf("%s", s);
    22             year = (s[0] - '0') * 1000 + (s[1] - '0') * 100 + (s[2] - '0') * 10 + s[3] - '0';
    23             if(s[5]-'0' != 0)
    24             {
    25                 month = (s[5] - '0')*10 + s[6] - '0';
    26             }
    27             else
    28             {
    29                 month = s[6] - '0';
    30             }
    31             if(s[8]-'0' != 0)
    32             {
    33                 day = (s[8] - '0')*10 + s[9] - '0';
    34             }
    35             else
    36             {
    37                 day = s[9] - '0';
    38             }
    39             //if(month == 2 && day == 29 && !judge(year + 18))//18年之后肯定不会有18岁,额,常识
    40             if(month == 2 && day == 29)
    41             {
    42                 printf("-1
    ");
    43                 continue;
    44             }
    45         //    if(month == 2 && day == 28 && judge(year+18))
    46         //        sum+=1;
    47             if(judge(year))/*判断出生日期是平或闰*/
    48             {
    49                 md[2] = 29;
    50             }
    51             sum = 0;
    52             /*计算本年度剩余天数*/
    53             sum += md[month] - day;
    54             for(i = month + 1; i <= 12; i++){
    55 
    56                     sum += md[i];
    57 
    58             }
    59             /*计算中间天数*/
    60             for(i = year + 1; i <= year + 17; i++){
    61 
    62                     sum += yd[judge(i)];
    63 
    64             }
    65             /*计算18岁那年过的天数*/
    66             if(!judge(i))
    67                 md[2] = 28;
    68             else
    69             {
    70                 md[2] = 29;
    71             }
    72             for(i = 1; i <= month - 1; i++){
    73 
    74                     sum += md[i];
    75 
    76             }
    77             sum += day;
    78             /*输出*/
    79             printf("%d
    ", sum);                           
    80     }
    81     return 0;
    82 }
    View Code

    以下是简化的,只考虑每一年的天数,这样就不再计算出生年剩于天数和18年后的天数,因为,他们拼凑起来恰好是一年,接下来只需对特殊情况判断即可。

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 
     4 int nian(int a)
     5 {
     6     if(a%4==0&&a%100!=0||a%400==0)
     7     return 1;
     8     return 0;
     9 } 
    10 
    11 int main()
    12 {
    13     int T;
    14     scanf("%d",&T);
    15     while(T--)
    16     {  int sum=0,i,x,y,z;
    17        scanf("%d-%d-%d" ,&x,&y,&z);//这里忽略前面那个0 
    18        if(!(!nian(x)||y!=2||z!=29))
    19        printf("-1
    ");
    20        else
    21        {
    22           
    23            for(i=x+1;i<=x+18;i++)
    24            {
    25              if(nian(i))
    26              sum+=366;
    27              else
    28              sum+=365;
    29            }
    30            if(nian(x)&&y<=2)
    31            sum+=1;
    32            if(nian(x+18)&&y<=2)
    33            sum-=1;
    34            printf("%d
    ",sum);
    35        }
    36     }
    37 return 0;
    38 }
    View Code
  • 相关阅读:
    BZOJ 1441: Min exgcd
    luogu 1876 开灯 约数+打表
    luogu 1414 又是毕业季II 约数相关
    BZOJ1968: [Ahoi2005]COMMON 约数研究 线性筛
    luogu 3441 [POI2006]MET-Subway 拓扑排序+思维
    Comet OJ
    CF990G GCD Counting 点分治+容斥+暴力
    CF873F Forbidden Indices 后缀自动机+水题
    CF293E Close Vertices 点分治+树状数组
    CF1101D GCD Counting 点分治+质因数分解
  • 原文地址:https://www.cnblogs.com/the-one/p/3263545.html
Copyright © 2011-2022 走看看