1027 - 18岁生日
时间限制 : 1 秒
内存限制 : 32 MB
小明的18岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出生开始,到达18岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所以他想请你帮忙计算一下他和他的几个朋友从出生到达18岁生日所经过的总天数,让他好来比较一下。
题目输入
输入的第一行是一个数T,后面T行每行有一个日期,格式是YYYY-MM-DD。如我的生日是1988-03-07。
题目输出
T行,每行一个数,表示此人从出生到18岁生日所经过的天数。如果这个人没有18岁生日,就输出-1。
输入/输出样例
输入格式
1 1988-03-07
输出格式
6574
C语言解答
#include<stdio.h> int leap(int y) { return y%4==0&&y%100!=0||y%400==0?1:0; } int main() { int t,y,m,d,i,s; scanf("%d",&t); while(t--) { scanf("%d-%d-%d",&y,&m,&d); s=6570; if(m==2&&d==29) { if(!leap(y+18)) printf("-1\n"); else { for(i=y+1;i<=y+18;i++) if(!leap(i)) s--; printf("%d\n",s); } } else { if(m<=2) { for(i=y;i<y+18;i++) if(leap(i)) s++; } else for(i=y+1;i<=y+18;i++) if(leap(i)) s++; printf("%d\n",s); } } return 0; }
C++解答
#include<stdio.h> int leap(int y) { return y%4==0&&y%100!=0||y%400==0?1:0; } int main() { int t,y,m,d,i,s; scanf("%d",&t); while(t--) { scanf("%d-%d-%d",&y,&m,&d); s=6570; if(m==2&&d==29) { if(!leap(y+18)) printf("-1\n"); else { for(i=y+1;i<=y+18;i++) if(!leap(i)) s--; printf("%d\n",s); } } else { if(m<=2) { for(i=y;i<y+18;i++) if(leap(i)) s++; } else for(i=y+1;i<=y+18;i++) if(leap(i)) s++; printf("%d\n",s); } } return 0; }
Java解答
public class Main { public static void main(String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); while (in.hasNext()) { int N=in.nextInt(); for(int i=0;i<N;i++) { String [] a=in.next().split("-"); int b=Integer.parseInt(a[0]); int c=Integer.parseInt(a[1]); int d=Integer.parseInt(a[2]); int sum=0; if(c==2&&d==29) if((b%4==0&&b%100!=0)||b%400==0) { System.out.println(-1);continue;} for(int n=b;n<=b+17;n++) { if((n%4==0&&n%100!=0)||n%400==0) { sum=sum+366; } else sum=sum+365; } int n=b;int x=0; for(int j=1;j<c;j++) { if(j==1||j==3||j==5||j==7||j==8||j==10||j==12) { x=x+31; } if(j==4||j==6||j==9||j==11) { x=x+30; } if(j==2) { if((n%4==0&&n%100!=0)||n%400==0){ x=x+29; } else x=x+28; } } x=x+d; sum=sum-x; int f=b+18; for(int j=1;j<c;j++) { if(j==1||j==3||j==5||j==7||j==8||j==10||j==12) { sum=sum+31; } if(j==4||j==6||j==9||j==11) { sum=sum+30; } if(j==2) { if((f%4==0&&f%100!=0)||f%400==0){ sum =sum+29; } else sum=sum+28; } } sum=sum+d; System.out.println(sum); } } in.close(); } }
Python解答
def isLeap(year): if (year%4==0 and year%100!=0) or year%400==0: return True else: return False def compute(date): #compute tail-year days month_leap = [31,29,31,30, 31,30,31,31, 30,31,30,31] month_noleap = [31,28,31,30, 31,30,31,31, 30,31,30,31] num = 0 if isLeap(date[0])and date[2]<=month_leap[date[1]-1]: for i in month_leap[0:date[1]-1]:num+=i elif not isLeap(date[0])and date[2]<=month_noleap[date[1]-1]: for i in month_noleap[0:date[1]-1]:num+=i else: return -1 num += date[2] return num t = input() while t: date = [int(i) for i in raw_input().split('-')] #compute tail-year days num = compute(date) if isLeap(date[0]):num=366-num else:num=365-num #compute 16-year days for i in range(1,18): if isLeap(date[0]+i):num+=366 else :num+=365 #compute tail-year days date[0]+=18 #print date if compute(date)!=-1: num+=compute(date) print num else:print -1 t -= 1 if t==0:break