今夕何夕(思路详解)

- 前言
辣鸡作者在写不出正确代码的情况下,逛了一小时的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;
}

如有建议,不胜感激。如有兴趣,动动小手,给小菜鸡点个关注,若想交流,加个好友,留言即可。

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值