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 }
以下是简化的,只考虑每一年的天数,这样就不再计算出生年剩于天数和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 }