时光计算 已知天数算日期

题目描述
“人生最苦之事莫过于明知要失去,但是却还没发生。”——基兰

废墟之地,曾经有一座恢宏的城池,很久以前在一场可怕的符文战争中灰飞烟灭,就像宏伟屏障之下的大多数陆地一样。

尽管如此,还是有一个人生还了下来:一名叫做基兰的魔法师。对于他这样一个时光痴迷者来说,住在城市的钟塔之中是再合适不过了。

现在他在精神上漂浮于时间中,思考未来之事。

他知道一个时间点,以及多个时间间隔(天),他想知道经过这些时间间隔之后的时间点。

输入
第一行输入T,表示数据组数

第二行输入一个日期 yyyy-mm-dd

对于 每组数据,输入一个时间间隔 t

输出
每组输出经过t天后的日期,以yyyy-mm-dd的格式

每组数据一行

样例输入
2
1777-4-30
5343
8113
样例输出
1791-12-16
1799-07-17

#include<stdio.h>

int l[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

int leap(int y){
    if((y%4==0&&y%100!=0)||(y%400)==0){
        return 1;
    }
    return 0;
} 

int main(){
    int n,y,m,d,a,b,c;
    scanf("%d",&n);
    scanf("%d-%d-%d",&y,&m,&d);
    a=y;b=m;c=d;
    while(n>0){//多次输入 
        y=a;m=b;d=c;
        int t;
        scanf("%d",&t);
        while(t>0){//当还有天剩余 
            if(t>=366){//剩余天数比一年多 
               if(leap(y+1)==1&&m>=3||leap(y)==1&&m<3){
                   t-=366;
               }   
               else t-=365;
               y++;     
            }
            else if(t>31){//剩余天数比一年少且大于一个月 
                t-=l[m];m++;
                if(leap(y)==1&&m==3){t-=1;}
                if(m==13){
                    y++;m-=12;
                }
            }
            else{//剩余天数不一定大于一个月
                d=d+t;
                t=0;
                if(leap(y)==1){
                    l[2]=29;//闰年229天   
                } 
                while(d>l[m]){ 
                    d-=l[m];
                    m++;
                    if(m==13){
                       y++;m-=12;
                    }
                }
                l[2]=28;//这里很重要,我就没有然后一直过不了,如果没有,之后的年若是平年,2月也变成29天了,就错了             
            }       
        }
        printf("%04d-%02d-%02d\n",y,m,d);
        n--;
    }
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值