- 前言
辣鸡作者在写不出正确代码的情况下,逛了一小时的CSDN,看了大约六个人的不同解法之后,提炼出思路最简单的方法
- 题干
今天是2017年8月6日,农历闰六月十五。
小度独自凭栏,望着一轮圆月,发出了“今夕何夕,见此良人”的寂寞感慨。
为了排遣郁结,它决定思考一个数学问题:接下来最近的哪一年里的同一个日子,和今天的星期数一样?比如今天是8月6日,星期日。下一个也是星期日的8月6日发生在2023年。
小贴士:在公历中,能被4整除但不能被100整除,或能被400整除的年份即为闰年。
【输入形式】
第一行为T,表示输入数据组数。
每组数据包含一个日期,格式为YYYY-MM-DD。
1 ≤ T ≤ 10000, YYYY ≥ 0
日期一定是个合法的日期
- 思路简述
1、从y年m月d日到x年m月d日,所经历的天数刚好为7的倍数。
2、小伙伴们可能出现错误的地方就是,闰年的2月29日这一天,及其前后该如何处理,其实你自己在草稿纸上模拟一次,不难发现,《1》2月29日之前,如果这一年是闰年的话,那它到m月d日就会经历366天,《2》如果是2月29日之后,那只有它的下一年是闰年的时候当它到下一年的m月d日时会经理366天。《3》如果是2月29日当天的话,它一直到下一个2月29日,会经历3个平年,一个闰年,也就是3653+366天(或者是3654+1天)。
- 辣鸡作者的代码
# include <iostream>
using namespace std;
bool is_leap(int x){
return ((x%4==0)&&(x%100==0))||(x%400==0);}
bool is_exit(int x){
return x%7==0;
}
int pro(int year,int month,int day){
int num=0;
while(1){
//情况1:2月29日当天
if (month==2&&day==29){
if (is_leap(year)){
year+=4;
sum += 365*4+1;
}else{
year+=4;
sum+=365*4;
}
if (is_exit(sum)) return year;
}
//情况2:在2月之后
else if (month>2){
if (is_leap(year+1)){
sum+=366;
year++;
}else{
sum+=365;
year++;
}
if (is_exit(sum)) return year;
}
else if (month<=2){
if (is_leap(year)){
sum+=366;
year++;
}else{
sum+=365;
year++;
}
if (is_exit(sum)) return year;
}
}
}
int main(){
int T;
cin>>T;
int Year[T],Month[T],Day[T],Result[T];
char q1,q2;
for (int i=0;i<T;i++){
cin>>Year[i]>>q1>>Month[i]>>q2>>Day[i];}
for (int i=0;i<T;i++){
cout<<pro(Year[i],Month[i],Day[i])<<endl;}
return 0;
}
如有建议,不胜感激。如有兴趣,动动小手,给小菜鸡点个关注,若想交流,加个好友,留言即可。