愛的日期---日期推算的兩種解答

我今天無意中發現日期解答有一個萬能公式----基姆拉爾森計算公式,那麼這個題,便有兩種不同的解答方式,一種是簡單的模擬,另一種是利用公式解答;

在這裏插入圖片描述

算星期幾神器——基姆拉爾森計算公式

介紹一個算星期幾的神器,至少在我知道這個公式之後,關於星期幾這個問題,我在也沒有算錯過=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;
}

喜歡的話,就點一個贊吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章