[蓝桥杯2015初赛]星系炸弹

该博客介绍了一个计算X星系中定时炸弹爆炸日期的算法。输入包含放置年份、月份、日期和定时天数,通过处理闰年和不同月份的天数,计算出准确的爆炸日期。示例给出了2015年11月15日放置、定时15天的炸弹将在2015年1月16日爆炸,以及2014年11月9日放置、定时1000天的炸弹将在2017年8月5日爆炸。代码实现了这个计算过程,包括检查闰年和计算跨年爆炸日期的逻辑。
摘要由CSDN通过智能技术生成

题目描述

在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。
每个炸弹都可以设定多少天之后爆炸。
比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。
有一个贝塔炸弹,a年b月c日放置,定时为n天,请你计算它爆炸的准确日期。

输入格式

输入存在多组数据,每组数据输入一行,每一行输入四个正整数a,b,c,n
输入保证日期在1000-01-01到2020-01-01之间,且日期合法。
n不超过1000

输入样例

2015 1 1 15
2014 11 9 1000

输出样例

2015-01-16
2017-08-05
#include <iostream>
using namespace std;
int months[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int check(int year){
    if(year%400==0) return 1;
    if(year%4==0&&year%100!=0) return 1;
    return 0;
}
//distance是总剩余天数, restday是当年内还剩余的天数
int main(){
    int year,month,day,distance;
    while(scanf("%d %d %d %d",&year,&month,&day,&distance)!=EOF){
        int restday=0;
        restday+=months[month-1]-day;
        if(check(year)&&month<=2&&day<29)
            restday+=1;
        for(int i=month;i<=11;i++){
            restday+=months[i];
        }
        if(distance>restday){
            while(distance>restday){
                distance-=restday+1;
                year++;
                month=1;day=1;
                if(check(year))
                    restday=365;
                else
                    restday=364;
            }
        }
        if(distance==restday){
            //year+=1;
            //month=1;day=1;
            printf("%4d-%02d-%02d\n",year,12,31);
            continue;
        }
        if(distance<restday){
            restday=distance;
            //printf("%d\n",restday);
            for(int i=month-1;i<=11;i++){
                if(check(year)&&i==1)
                    months[1]=29;
                if(day+restday<months[i]){
                    day+=restday;
                    restday=0;
                    break;
                }
                else if(day+restday>months[i]){
                    month++;
                    restday-=months[i]-day+1;
                    day=1;
                }else if(day+restday==months[i]){
                    restday=0;
                    day=months[i];
                    break;
                }
                months[1]=28;
            }
            printf("%4d-%02d-%02d\n",year,month,day);
        }

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值