作者:上进小菜猪
链接: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;
}