日期计算有感

作者:上进小菜猪
链接:https://www.zhihu.com/question/451743472/answer/2391455764
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

世纪末的星期

曾有邪教称1999年12月31日是世界末日。当然该谣言已经不攻自破。
还有人称今后的某个世纪末的12月31日,如果是星期一则会…
有趣的是,任何一个世纪末的年份的12月31日都不可能是星期一!!
于是,“谣言制造商”又修改为星期日…
1999年的12月31日是星期五,请问:未来哪一个离我们最近的一个世纪末年
(即xx99年)的12月31日正好是星期天(即星期日)?
请回答该年份(只写这个4位整数,不要写12月31等多余信息)

思路分析
我们观察,发现这道题非常巧妙,不需要我们去一天一天去遍历。因为我们做对闰年366平年355.
如果从1999年12月31日到200012月31日是365天,我们可以计算出一共有多少天,遍历星期即可。

看我的解题代码:

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int year=1999;
    int day=0;
    int xinqi=5;
    for(int i=0;;i++)
    {
        if(year%4==0&&year%100!=0||year%400==0)
        {
            day+=366;
        }
        else{
            day+=365;
        }
        year++;
        if(year%100==99)
        {
            int sum;
            int xinqi1=xinqi;
            sum=day%7;
            xinqi1+=sum;
            if(xinqi1>7)
            {
                xinqi1-=7;
            }
            if(xinqi1==7)
            {
                break;
            }
        }
    }
    cout<<year;


}

答案:

2299

四,再来一道难度大点的真题

跑步锻炼

小蓝每天都锻炼身体。

正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(11日),为了激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。

小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年 10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?

运行限制
最大运行时间:1s
最大运行内存: 128M

看我的解法:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int pyear[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int ryear[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
    int year=2000,month=1,day=1,sumday=0,sum=2,xinq=6;
    while(1)
    {
        //闰年

        if(year%4==0&&year%100!=0||year%400==0)
        {
            if(day<ryear[month])
            {
                day++;
            }
            else
            {
                day=1;
                if(month<12)
                {
                    month++;
                }
                else{
                        year++;
                        month=1;
                }
            }
        }
        else
        {
            if(day<pyear[month])
            {
                day++;
            }
            else
            {
                day=1;
                if(month<12)
                {
                    month++;
                }
                else{
                        year++;
                        month=1;
                }
            }
        }

        sum++;
        xinq++;
        if(xinq>7)
        {
            xinq-=7;
        }
        if(day==1||xinq==1)
        {
            sum++;
        }

        if(year==2020&&month==10&&day==1)
        {
            break;
        }




    }

cout<<sum;
return 0;
}

答案:

8879

心得:这道题有一定难度的,我第一次输出8877,少了,最后的一天,这点需要注意,他的边界值的考虑。

五,还不是很顺畅,再来一道真题吧

星期一

题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

整个 2020 世纪(1901 年 1 月 1 日至 2000 年 12 月 31 日之间),一共有多少个星期一?
2000 年 12 月 31 日为礼拜日。

运行限制 最大运行时间:1s 最大运行内存: 128M

来看我的c++解法:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int year=1901,sum=0,xinq=7;
    for(int i=year;;i++)
    {
        if(i%4==0&i%100!=0||i%400==0)
        {
            sum+=366;
        }
        else{
            sum+=365;
        }
        if(i==2000)
        {
            break;
        }
    }
    sum--;
    int ss,xx;
    xx=sum/7;
    ss=sum%7;
    xinq+=ss;
    if(xinq>7)
    {
        xinq-=7;
    }
    //cout<<"那天是礼拜"<<xinq<<endl;
    cout<<xx;

return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值