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\n");
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\n", 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\n");
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\n",sum);
35        }
36     }
37 return 0;
38 }
View Code

 

posted @ 2013-08-16 21:25  心中的阿哲  阅读(372)  评论(0编辑  收藏  举报