嘿嘿嘿灬 2020-01-20 00:06 采纳率: 0%
浏览 1432

求指定日期前后n天的日期

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;
}
  • 写回答

1条回答 默认 最新

  • threenewbee 2020-01-20 09:27
    关注

    没有信用,没有选上也没有采纳率,就不详细回答了,参考:https://blog.csdn.net/qq_42817826/article/details/81582935

    评论

报告相同问题?

悬赏问题

  • ¥15 luckysheet
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型
  • ¥50 buildozer打包kivy app失败
  • ¥30 在vs2022里运行python代码
  • ¥15 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误