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

 

你可能感兴趣的:(HDU)