题目描述
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;
}