天天看點

算法題每日一練---第28天:世紀末的星期

一、問題描述

曾有人稱 1999 年 12 月 31 日是世界末日。當然該謠言已經不攻自破。

還有人稱今後的某個世紀末的 12 月 31 日,如果是星期一則會....

有趣的是,任何一個世紀末的年份的 12 月 31 日都不可能是星期一 !!

于是,“謠言制造商”又修改為星期日......

1999 年的 12 月 31 日是星期五,請問:未來哪一個離我們最近的一個世紀末年(即 xx99 年)的 12 月 31 日正好是星期天(即星期日)?

二、題目要求

考察

1.日期問題
2.建議用時10~20min
           

三、問題分析

這一題是一個日期問題,題目給出1999 年的 12 月 31 日是星期五,求出接下來最近的世紀末年。分成兩步解決,先求出每一個年份的天數,在求出目前年份的最後一天是不是星期天。

1.判斷年份

對于年份來說,首先判斷是不是閏年,根據閏年規則“四年一閏,百年不閏,四百年一閏”,年份滿足下列條件之一,則為閏年。

(1)能被4整除且不能被100整除(如2004年是閏年,而1900年不是)

(2)能被400整除(如2000年是閏年)

代碼實作  y%400==0||y%4==0&&y%100!=0
           

2.判斷日期

q=(q+d%7)%7;//判斷目前年份最後一天星期幾
if(q==0&&n%100==99)//滿足條件
{
        cout<<n;//輸出結果
        exit(0);//退出循環
}
           

四、編碼實作

#include<iostream>
using namespace std;
int main()
{
	int i,n,d,q=5;//初始化,d代表目前年份天數,q代表星期幾
	for(i=2000;;i++)//開始循環
	{
		n=i;
		if(n%400==0||n%4==0&&n%100!=0)//判斷是否為閏年
		{
			d=366;
		}
		else
			d=365;
		q=(q+d%7)%7;//判斷目前年份最後一天星期幾
		if(q==0&&n%100==99)//滿足條件
		{
			cout<<n;//輸出結果
			exit(0);//退出循環
		}
	}
	return 0;
}
           

五、輸出結果

輸出結果為:2299

算法題每日一練---第28天:世紀末的星期

六、總結與提高