爱的日期---日期推算的两种解答

我今天无意中发现日期解答有一个万能公式----基姆拉尔森计算公式,那么这个题,便有两种不同的解答方式,一种是简单的模拟,另一种是利用公式解答;

在这里插入图片描述

算星期几神器——基姆拉尔森计算公式

介绍一个算星期几的神器,至少在我知道这个公式之后,关于星期几这个问题,我在也没有算错过=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;
}

喜欢的话,就点一个赞吧!

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