星系炸弹2.0 C语言

文章介绍了作者改进的代码,用以快速计算X星系中炸弹的爆炸日期,通过年份、月份并行处理提高效率。
摘要由CSDN通过智能技术生成

昨天其实已经编写过星系炸弹的代码了,但后来我查了一下,发现还有一种更快速的方法,于是,今天早上我把它写出来了。

问题:

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

代码:


#include<stdio.h>

void Date(int * yar, int * mth, int * day, int n);
int DaysMonth(int yar, int mth);
int DaysYear(int yar);

int main(void)
{
    int yar, mth, day, n;
    scanf("%d%d%d%d", &yar, &mth, &day, &n);
    Date(&yar, &mth, &day, n);
    printf("%d %d %d\n", yar, mth, day);
    return 0;
}
void Date(int * yar, int * mth, int * day, int n)
{
    for (int i = 1; i < *mth; i++)
    {
        n = n + DaysMonth(*yar, i);
    }
    n = n + *day - 1;
    *mth = 1, *day = 1;
    while (n >= DaysYear(*yar))
    {
        n = n - DaysYear(*yar);
        (*yar)++;
    }
    while (n >= DaysMonth(*yar, *mth))
    {
        n = n - DaysMonth(*yar, *mth);
        (*mth)++;
    }
    (*day) = (*day) + n;
    return ;
}
int DaysMonth(int yar, int mth)
{
    if (mth == 4 || mth == 6 || mth == 9 || mth == 11)
    {
        return 30;
    }
    else if(mth != 2)
    {
        return 31;
    }
    else
    {
        if ((yar % 400 == 0) || (yar % 4 == 0 && yar % 100 != 0))
        {
            return 29;
        }
        else
        {
            return 28;
        }
    }
}
int DaysYear(int yar)
{
    if ((yar % 400 == 0) || (yar % 4 == 0 && yar % 100 != 0))
    {
        return 366;
    }
    else
    {
        return 365;
    }
}


这次的程序运行速度很快,特别是当n的值大于一年时,昨天我编写的程序只能一天一天的加,但今天这个程序却可以先一年一年加,再一月一月加,最后一天一天加,如果n的值大于一年的话,那么它运算一次就相当于昨天程序运行的365次或366次。

DaysYear函数用于判断某年是闰年还是平年,并返回相应的天数,DaysMonth函数则用于判断某年某月是多少天并返回这个天数。

假设输入的是2014 11 9 1000,那么在Date函数运行开始时,会先将2014.11.9退回2014.1.1,并将退回的天数加到n中,这样做是为了方便之后一年一年的加天数。

执行完这一步后就开始判断n的值是否大于本年的天数了,如果大于就跳到下一年一月一号,并让n减去本年的天数,注意花括号中的两句顺序不能相反,否则n减去的天数就不是本年的天数了,而是下一年的,当n<本年天数时,说明n的值已经不具备跳过一整年的能力了,那么就退出循环,开始跳过月份,而此时年份也已经确定下来了。

第二个循环与第一个循环差不多,只是年变成了月而已,当从这个while中跳出时,说明月份也确定下来了,n的值已经不能跳过一整月了。

天数的增加不必使用循环,直接加就行了,也不必担心会加出月份天数的极限,因为从上一个循环出来,就意味着n不具备这样的能力。

至此,Date函数结束,返回主调函数,主调函数中yar,mth,day都变成了想要的值,可以输入答案了。

答案是:2017 8 5

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值