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

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 16:09   2815   0

若某个月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 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP