问题 1240: 生日日数【两种方法】

CCC老师的生日是1979年4月16日,他想要找到自己出生后第一万天的纪念日日期。输入为合法日期,输出格式为 'Y-M-D'。代码实现过程中注意到了闰年和平年2月天数错误的问题,提供了两种不同的计数方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

CCC老师的生日是YY年MM月DD日,他想知道自己出生后第一万天纪念日的日期(出生日算第0天)。

输入
输入有多行,格式为YY MM DD 其中1949<=YY<=2006,日期绝对合法。

输出
输出有多行。即CCC老师生日第一万天以后的日期,格式为 “Y-M-D”。

样例输入
1979 4 16
样例输出
2006-9-1

Code

编写代码的时候出现一个天大的BUG:将闰年和平年的日期的2月天数颠倒了~~醉了

Code 1 一天一天加到10000

闰年判断不全面,但是中间并没有出现其他的情况

#include<stdio.h>
#define MAXN 10000
int calendar[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},
					 {0,31,29,31,30,31,30,31,31,30,31,30,31}};
int Runnian(int n)
{
	if(n%4==0)	return 1;
	else	return 0;
}
int main()
{
	int i,d,m,y;
	while(~scanf("%d%d%d", &y,&m,&d)){
		for(i=0;i<MAXN;i++){
			d++;
			if(d>calendar[Runnian(y)][m]){
				m++;
				d=1;
			}
			if(m>12){
				m=1;
				y++;
			}
		}
		printf("%d-%d-%d\n", y, m, d);
	}
	return 0;
}

Code 2 按照年份加到10000

#include<stdio.h>
#define MAXN 10000
int calendar[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},
					 {0,31,29,31,30,31,30,31,31,30,31,30,31}};
int Runnian(int n)
{
	if(n%400==0||(n%4==0&&n%100!=0))	return 1;
	else	return 0;
}
int main()
{
	int d,m,y,sum,run=366,ping=365,rdt;
	while(~scanf("%d%d%d", &y,&m,&d)){
		sum=0;
		//进行第一个月
		sum+=calendar[Runnian(y)][m];
		sum-=d;
		//将这一年计算完
		for(m++;m<13;m++){
			sum+=calendar[Runnian(y)][m];
		}
		y++;
		d=m=1;//下一年的1月1日,从今天开始过一天就是一天
		//计算年
		while(MAXN-sum>=366){//计算到不到一年的时候
			sum+=Runnian(y)?run:ping;
			y++;
		}
		//剩余的时间不到一年,从1月1日开始计算,过一天就计算一天
		while(1){
			sum+=calendar[Runnian(y)][m];
			if(sum>=MAXN)	break;
			m++;
			if(m>12){
				y++;
				m=1;
			}
		}
		//计算多余的时间用来往前推
		rdt=sum-MAXN;
		d=calendar[Runnian(y)][m];
		d-=rdt;
		printf("%d-%d-%d\n", y,m,d);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值