1027 - 18岁生日

通过次数

0

提交次数

0

时间限制 : 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