6004 18岁生日

问题描述:

Gardon的18岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出生开始,到达18岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所以他想请你帮忙计算一下他和他的几个朋友从出生到达18岁生日所经过的总天数,让他好来比较一下。

输入:

一个整数T,表示测试数据的组数,接下来有T行日期,每行一个,格式是YYYY-MM-DD。如我的生日是1988-03-07。

输出:

T行,每行一个数,表示此人从出生到18岁生日所经过的天数。如果这个人没有18岁生日,就输出-1。

输入样例:

1

1988-03-07

输出样例:

 6574

解题分析:

        此题需要考虑18岁当中闰年的个数。此外,还需要考虑出生当年和18岁那年是否为闰年,出生日期是否在2月28或29日前后。(若出生年为闰年,且生日在三月前,则出生年会多一个2.29;若18岁生日那天为闰年,且生日在3月后,则18岁那年会多一个2.29,然后再判断从y+1到y+17之间的年份有几个闰年即可。)

        这里还有个特殊的情况,就是可能不存在18岁生日那天,这个特殊情况很容易被忽略。

代码 

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int run(int n){
	if(n%4!=0||(n%100==0&&n%400!=0)) return 0;
	else return 1;
}

int main()
{
	int t,i;
	int y,m,d,sum=0;
	scanf("%d",&t);
	int y18;
	for(i=0;i<t;i++){
		scanf("%d-%d-%d",&y,&m,&d);
		if(m==2&&d==29){
			printf("-1\n");
			continue;
		}
		y18=y+18;
		if(run(y)&&m<3) sum++;
		if(run(y18)&&m>=3) sum++;
		sum=18*365;
		int j;
		for(j=y+1;j<y18;j++){
			sum+=run(j);
		}
		printf("%d\n",sum);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值