關於末日演算法

2021-08-22 09:56:27 字數 1711 閱讀 2694

2023年7月2日是星期幾?根據日期計算當天是星期幾是乙個有趣的問題,通常的思路是:選擇任意一天作為我們計算的基礎,比如2023年8月5日星期日,然後計算出目標日期與基礎日期相差多少天,再推算目標日期是星期幾。在沒有遇見末日演算法之前,我大概不會深入思考這個問題,然後按照上述思路草草解決。但是末日演算法給我們提供了一種新的思路或者說優化了前述的演算法。

末日演算法假設每一年2月的最後一天是末日,因此每一年的3月7日,4月4日,5月9日,6月6日,7月11日,8月8日,9月5日,10月10日,11月7日,12月12日的星期必然和末日的星期相同,因為這些日期和末日相差的天數正好是7的倍數。除此之外,因為平年一年365天,閏年一年366天,所以每過乙個平年,末日的星期數加1,每過乙個閏年,末日的星期數加2(365 % 7 = 1, 366 % 7 = 2)。這樣一來,只要我們知道某一年的末日是星期幾,就可以按照末日演算法的思路快速地計算出目標日期是星期幾。

雖然末日演算法最後還是要計算時間差,但是它極大地節省了計算量,也許這點計算量在現今的計算環境下算不了什麼,但它讓我看到了有意思的想法,如果我沒有遇見末日演算法,我可能不會繼續深入思考這個問題,程式設計的秘密不僅僅是機械地解決問題,更在於理解邏輯和生活的本質。

const weeklist = [

'星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'

];const doombase = ;

const searchmap = ;

function isleapyear( year )

function positivemodulo( a, b )

return result;

}function getdoomday( year )

}} else

}} result = positivemodulo( result, 7 );

return result;

}function getweek( year, month, day ) else

} else

result = doomday + offset;

result = positivemodulo( result, 7 );

return result;

}function isvalidatedate( year, month, day ) ;

daycountmap[ '2' ] = isleapyear( year ) ? 29 : 28;

if ( month < 1 || month > 12 )

if ( day > daycountmap[ month ] )

return result;

}function getdatestring( year, month, day )

const testdata = [

[ 2199, 7, 2 ],

[ 1994, 7, 5 ],

[ 1994, 5, 27 ],

[ 1994, 2, 28 ],

[ 1994, 1, 1 ],

[ 1994, 1, 31 ],

[ 1994, 2, 1 ],

[ 1994, 0, 1 ],

[ 1994, 2, 29 ]

];const testfunction = () => else

} );

};testfunction();

末日的愛情

末日的愛情 悲傷逆流成河 題記 任何開始都命中註定著結束,花開終有花落的一天。指尖滑落的悲傷,只在我們的心底留下永遠的回憶。他日的快樂鑄就今日之痛,經歷過快樂的人很難有勇氣去面對這種陰魂不散的痛,即使我們早就做好了心理準備,準備迎接一切暴風雨的來臨。任何事物本應該有乙個完美的過程,而我的愛情還沒有開...

寫在末日年初

昨天是學校統一放假 這一年我的大三也過了一半 也經歷了乙個最忙碌的學期,不得不說時間過的真的很快,早就沒有了那種悠閒愜意的心情,迎接的都是要做的好多事情。記得電影 當幸福來敲門 男主人公在自白他成功前的那一段時間這麼說 我的這段人生叫做奔跑。我現在離所謂的成功還很遠,是在一點點的向上爬,但是要不斷的...

末日的傳說

看了半天單純的全排列和逆序對,發現 和這個題沒什麼關係。實在不會做 大致思路 乙個長度為n的排列最多有 n 1 n 2個逆序對。把越小的元素放在越前面,肯定逆序對就少了 貪心 若題目中給的m n 2 n 1 2,那就可以把最小的元素放在最前面。若m n 2 n 1 2,就要盡可能把最小的元素往後放。...