bei'zhan蓝桥杯的一道练习题:
给定一个日期:2013年3月24日,求从这个日期开始往前n天和往后n天的日期。
输入:
输入首先包含一个整数N,表示有N组测试用例;
接下来N行是N组数据,每一行包含一个正整数D(D<=10,0000),
D表示穿越的天数。
输出:
分别输出向前走D天和向后走D天的日期,两个日期中间用一个空格隔开,每组数据占一行。
样例输入:
2
6
30
样例输出:
2013/03/30 2013/03/18
2013/04/23 2013/02/22
下面是我写的代码,总是答案错误,我又试了好多例子都没什么问题,求指点
#include
int Leap(int year)//判断闰年函数
{
if((year%4==0&&year%100!=0)||(year%400==0))
return 1;
return 0;
}
void transit(int d)
{
int year=2013,month=3,day=24,i;
int by=year,bm=month,bd=day;
int gy=year,gm=month,gd=day;
//by,bm,bd分别表示向未来经过d天的年月日,gy,gm,
gd分别表示向过去走d天后的年月日
for(i=1;i<=d;i++)
{
bd++;//向未来走d天
if(bm==1||bm==3||bm==5||bm==7||bm==8||bm==10)//当月份天数为31天的时候
{
if(bd==32)
{
bd=1;
bm++;
}
}
if(bm==2)//二月因为分闰年平年所以单独判断
{
if(Leap(by)&&bd==30)
{
bd=1;
bm++;
}
else
{
if(bd==29)
{
bd=1;
bm++;
}
}
}
if(bm==4||bm==6||bm==9||bm==11)//月份天数为30天的时候
{
if(bd==31)
{
bd=1;
bm++;
}
}
if(bm==12)//12月因为涉及到年份的增加所以单独判断
{
if(bd==32)
{
bd=1;
bm=1;
by++;
}
}
gd--;//向过去走d天
if(gm==2||gm==4||gm==6||gm==8||gm==9||gm==11)//月份天数为31天
{
if(gd==0)
{
gd=31;
gm--;
}
}
if(gm==3)//二月
{
if(gd==0)
{
gm--;
if(Leap(gy))
gd=29;
else
gd=28;
}
}
if(gm==5||gm==7||gm==10||gm==12)//月份天数为30天
{
if(gd==0)
{
gd=30;
gm--;
}
}
if(gm==1)//1月因为涉及到年份的减少所以单独判断
{
if(gd==0)
{
gd=31;
gm=12;
gy--;
}
}
}
//输出日期,月和日如果只有一位数则在前面补零
if(bm/10==0)
{
if(bd/10==0)
printf("%d/0%d/0%d ",by,bm,bd);
else
printf("%d/0%d/%d ",by,bm,bd);
}
else
{
if(bd/10==0)
printf("%d/%d/0%d ",by,bm,bd);
else
printf("%d/%d/%d ",by,bm,bd);
}
if(gm/10==0)
{
if(gd/10==0)
printf("%d/0%d/0%d\n",gy,gm,gd);
else
printf("%d/0%d/%d\n",gy,gm,gd);
}
else
{
if(gd/10==0)
printf("%d/%d/0%d\n",gy,gm,gd);
else
printf("%d/%d/%d\n",gy,gm,gd);
}
}
int main()
{
int n,d;
scanf("%d",&n);//n组数据,天数为d
while(n--)
{
scanf("%d",&d);
transit(d);
}
return 0;
}