HDU 6112黑色星期五 蓝桥基拉姆森公式

若某个月13号恰好是星期五,则这一天被称为黑色星期五。已知某年的一月一日是星期w,并且这一年是闰年,
求出这一年所有13号那天是星期5的月份,按从小到大的顺序输出月份数字。(w=1..7)输入输入有多组,每组一行且为一个整数w, 指该年的一月一日是星期w。(1<=w<=7)输出

每组数据输出一行,从小到大输出具有黑色星期五的月份,月份与月份之间用空格隔开。若没有月份具有黑色星期五,则输出NULL

 

用基姆拉尔森公式得到

约定下式中 y-年,m-月,d-日,w-星期

w=(d+m*2+3*(m+1)/5+y+y/4-y/100+y/400+1)mod7

特别需要注意的是,当月份为1月或者二月是,日期需要有所变动

举个栗子,如果是1993-1-13,带入上面公式的日期需要变换为 1992-13-13

如果是1993-2-13,那么需要变换为 1992-14-13

注意:w==0?7:w

#include<cstdio>
using namespace std;


int m[13] = {0,31,29,31,30,31,30,31,31,30,31,30,31};


int main()
{
    int mon;
    while(scanf("%d",&mon) == 1)
    {
       for(int i = 1; i <= 12; i ++)
       {
               if((12+mon)%7 == 5)
               {
                   printf("%d",i);
                   if(i != 12) printf(" ");
               }
               mon = (m[i]+mon)%7; 
       } 
       printf("/n"); 
    }
    return 0;

}

HDU 6112:

 

今天是2017年8月6日,农历闰六月十五。

小度独自凭栏,望着一轮圆月,发出了“今夕何夕,见此良人”的寂寞感慨。

为了排遣郁结,它决定思考一个数学问题:接下来最近的哪一年里的同一个日子,和今天的星期数一样?比如今天是8月6日,星期日。下一个也是星期日的8月6日发生在2023年。

小贴士:在公历中,能被4整除但不能被100整除,或能被400整除的年份即为闰年。

 

 

Input

第一行为T,表示输入数据组数。

每组数据包含一个日期,格式为YYYY-MM-DD。

1 ≤ T ≤ 10000

YYYY ≥ 2017

日期一定是个合法的日期
 

 

 

Output

对每组数据输出答案年份,题目保证答案不会超过四位数。

 

 

Sample Input

 

3 2017-08-06 2017-08-07 2018-01-01

 

 

Sample Output

 

2023 2023 2024

 

 

Source

2017"百度之星"程序设计大赛 - 初赛(A)

 

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int YYY,MM,DD,t;
bool run_year(int y)
{
	if(y%4==0&&y%100!=0||y%400==0)
	{
		return true;
	}
	return false;
}
bool panduan2(int y)
{
	if(!run_year(y)&&run_year(YYY)&&MM==2&&DD==29)
	return true;
return false;
}
int panduan1(int y,int m,int d)
{
	if(m==1||m==2)
 	{
 		y-=1;
 		m+=12;
 	}
 	int w=(d+m*2+(m+1)*3/5+y+y/4+y/400-y/100+1)%7;
 	return w==0?7:w;
}
 int main()
 {
 	int Y,M,w;
 	cin>>t;
 	while(t--)
 	{
	cin>>YYY;	getchar();
	cin>>MM;	getchar();
	cin>>DD;	getchar();
 	w=panduan1(YYY,MM,DD);
 	int ww;
 	for(int i=YYY+1; ;++i)
 	{
		if(panduan2(i))//在这儿要对一个闰年的2-29号特殊判断一下 
			continue; 
		ww=panduan1(i,MM,DD);
 		if(w==ww)
 		{
 			cout<<i<<endl;
 			break;
 		}
 	}
 	}
 
 return 0;
}

output

standard output

已知 2011 年 11 月 11 日是星期五,问 YYYY 年 MM 月 DD 日是星期几?注意考虑闰年的情况。尤其是逢百年不闰,逢 400 年闰的情况。

Input

输入只有一行 YYYY MM DD

Output

输出只有一行 W

W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7+1 
  (计算出的结果直接是对应的星期几) ,当month=1或2时,需要将其改为month+12并且year-1

#include<bits/stdc++.h>
using namespace std;
int  n;
void solve()
{
    int y,m,d;
    scanf("%d %d %d",&y,&m,&d);
    if(m==1||m==2) m+=12,y-=1;
    int w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7+1;
    cout<<w<<endl;
}
int main()
{
	solve();
return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值