我今天无意中发现日期解答有一个万能公式----基姆拉尔森计算公式,那么这个题,便有两种不同的解答方式,一种是简单的模拟,另一种是利用公式解答;
算星期几神器——基姆拉尔森计算公式
介绍一个算星期几的神器,至少在我知道这个公式之后,关于星期几这个问题,我在也没有算错过=o(▽)o♪
公式是这样的:w = (y + y /4 + y / 400 - y / 100 + 2 * m + 3 * (m + 1)/5 + d) % 7
;
其中: d为几号,m为月份,y为年份
- 注: 这个公式中,w = 0对应的是星期一,w = 6对应的是星期日
- 把一月和二月看为是上一年的十三月和十四月!!
题目链接:
爱的日期
AC代码: (PS:这两个代码比较简单,就不做注释了,如果有问题欢迎评论)
简单模拟:
#include <bits/stdc++.h>
using namespace std;
bool judge(int year)
{
if((year%400==0)||(year%4==0&&year%100!=0))
return true;
else
return false;
}
int main()
{
int year;
while(cin>>year)
{
int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int days=0;
for(int i=2000;i<year;i++)
{
if(judge(i))
days+=366;
else
days+=365;
}
if(judge(year))
day[2]=29;
int flag=0;
for(int i=1;i<=12;i++)
{
if((days+20)%7==0)
{
flag++;
if(flag==1)
cout<<i;
else
cout<<" "<<i;
}
days+=day[i];
}
if(flag==0)
cout<<"jiyagao"<<endl;
else
cout<<endl;
}
return 0;
}
利用公式:
#include <bits/stdc++.h>
using namespace std;
int weekday(int year,int mon,int day)
{
if(mon<3)
{
mon+=12;
year--;
}
int w=(year+year/4+year/400-year/100+2*mon+3*(mon+1)/5+day)%7;
return w;
}
int main()
{
int year;
while(cin>>year)
{
int flag=0;
for(int i=1;i<=12;i++)
{
if(weekday(year,i,20)==4)
{
flag++;
if(flag==1)
cout<<i;
else
cout<<" "<<i;
}
}
if(flag==0)
cout<<"jiyagao"<<endl;
else
cout<<endl;
}
return 0;
}
喜欢的话,就点一个赞吧!