我今天無意中發現日期解答有一個萬能公式----基姆拉爾森計算公式,那麼這個題,便有兩種不同的解答方式,一種是簡單的模擬,另一種是利用公式解答;
算星期幾神器——基姆拉爾森計算公式
介紹一個算星期幾的神器,至少在我知道這個公式之後,關於星期幾這個問題,我在也沒有算錯過=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;
}
喜歡的話,就點一個贊吧!