复杂的数学日期问题

当然可以。我可以通过心算和手算算出公历1200 -2400中任意一天的日子。其实并没有什么玄机。说2000年到2100是公日很简单,要求20XX年元旦那天也很简单。比如2033年元旦是哪天?即XX=33 xx乘以1,25=41.25,整数为4141÷7=5+6。这是2033年的元旦,是这个余数的星期六;为什么?看看万年历,你就明白了,2001的元旦是星期一,02是星期二,03是星期三,04是星期四,05是星期六,,,因为2004年是闰年,2月多一天等于29天。周的顺序不是年的顺序。不是吗!如果日历上没有闰年,那就是365天。如果7的模数是1(即余数除以7),那么时间顺序也是一周的顺序,但是没有闰年节气,就会不规则。我们做什么呢四年不是多了一天吗?当前年数的四分之一是额外天数。这个数加上以7为模的年数就是元旦的周值。至于具体是星期几,过去一些小商品是按周流通的,很有规律。例如,如果一年不是闰年,元旦在星期五(1月1日),那么10月1日也是星期五,星期六是5月1日,星期日是8月1日,星期一是2月、3月和11月,星期二是6月1日,星期三是9月和12月1日,星期四是4月和7月1日。小商品的万年历就是基于这个规律。放在食指的七个关节上计算非常方便。

/p/2796757357来团队专属贴吧提问。

最常见的公式:(觉得无聊就看公式)w =[y-1]+[(y-1)/4]-[(y-1)/100]+[(y-65438)最好的公式是丘勒公式:w =[c/4]-2c+y+[y/4]+[13 *(m+1)/165438+10月和2月要按上一年的65438+3月和65438+4月计算,这时C和Y都按上一年计算。[...]在两个公式中都表示只取计算结果的整数部分。将计算出的w除以7,余数是星期几。如果余数为0,则是星期天。- .据说因为圣经创世纪中规定上帝在创世纪中度过六天,第七天休息,所以人们也以七天为一个周期来安排自己的工作和生活,星期天是休息日。从实用的角度来看,以七天为一个周期也是合适的。所以,虽然中国传统的工作周期是十天(如王波《王腾亭序》中提到的“十天休”,意思是官员每十天工作一次,第十天休假),但后来采用了西方的周制。在日常生活中,我们经常会遇到知道今天是什么日子的问题。有时候,我们也想知道历史上是哪一天。通常情况下,解决这个问题的有效方法是看日历,但我们从来不把日历带在身边,更不用说已经存在了几千年的万年历了。如果要在计算机编程中计算星期几,事先存储万年历就更不现实了。这个时候有什么办法可以得到公式,从月日算起是星期几?答案是肯定的。其实我们经常这样做。先举个简单的例子。例如,知道2004年5月的1是一个星期六,就不难计算出2004年5月31日是世界无烟日。我们可以从1数到31,同时数周,最后可以算出5月31是星期一。其实用数学计算,不用掰手指。我们知道一周是七天的循环,所以5月1是恒星的第六天,七天后的5月8日也是星期六。在日期上,8-1=7,是7的倍数。同样,5月15、5月22日和5月29日也是星期六,它们的日期与5月1的差值分别是14、21和28,也是7的倍数。5月31呢?31-1=30.虽然不是7的倍数,但31除以7时,余数是2。也就是说,5月31的一周是5月1的一周之后两天。星期六后两天是星期一。这个简单的计算告诉了我们一个计算星期的基本思路:首先,我们要知道我们要计算的日子之前的某一天是哪一天,以这一天作为计算的标准,相当于计算的“原点”。其次,我们知道我们要计算的那一天与这某一天相差多少天。将这个日期的差除以7,余数表示我们要计算的一天中的一周在某一天的一周之后多少天。如果余数是0,说明这两天的星期是一样的。显然,如果作为“原点”的日期选择为星期日,那么余数正好等于星期几,这样计算就更方便了。但是直接计算两天之间的天数还是比较繁琐。比如1982的7月29日和2004年5月20日之间有7947天的间隔,所以不能一下子算出来。包括三个时期:一是7月29日之后的当年剩余天数,1982;二、1983-2003,二十一整年的所有日子;第三,从2004年元旦到5月的天数1。第二段比较好算。等于21*365+5=7670天。之所以加5,是因为这个时期有五个闰年。第一段和第三段比较麻烦。比如第三段,需要把5月前四个月的天数加起来,加上日期值,即31+29+31+30+1 = 122天。同理,第一段需要把7月后5个月的天数加起来,加上7月剩余的天数,a * * *就是155天。所以* * *之间的总天数是122+7670+155=7947天。仔细想想,如果选择“起源”日的日期为65438+2月31,那么第一段时间也是一整年。这样就可以把第一段时间和第二段时间合并计算,全年的总和正好等于两天的年差减一。如果进一步选取“起源”日期为公元前1,65438+2月31(或者天文学家使用的公元0年,65438+2月31),则全年的总数正好是要计算的一天中的年份减一。经过这种简化,我们只需要计算两个时间段:一是这么多整年的总天数;第二,你想算一年中的哪一天?无独有偶,根据公历的年月设置,我们可以这样回溯,而公元前1,公元前12,31恰好是一个星期天,也就是说,总天数除以7的余数正好是一周中的某一天。那么现在只有一个问题:这么多整年有多少个闰年?这就需要了解公历的闰规则。我们知道,公历平均一年是365天,闰年是366天。设置闰的方法是在2月被4整除的年份上加一天,但不是被100整除的闰,是被400整除的闰。所以1600、2000、2400这样的年份是闰年,1700、1800、1900、2100这样的年份是正常年份。根据公历,公元前1年也是闰年。所以从公元前1(或公元0)12 31到某年Y的所有年份的闰年数等于[(Y-1)/4]-[(Y-1)/65433。第一项表示需要加上被4整除的年数,第二项表示需要去掉被100整除的年数,第三项表示需要加上被400整除的年数。y之所以要减一,是因为我们得到了计算星期几的第一个公式:w =(y-1)* 365+[(y-1)/4]-[(y-1)/100]。计算出来的w是公元前1(或公元0)65438+2月31到这一天的天数。将w除以7,余数是多少,这一天就是一周中的某一天。比如我们来计算一下2004年5月的1:w =(2004-1)* 365+[(2004-1)/4]-[(2004-1)/100]。+(31+29+31+30+1) = 731702, 731702/7 = 104528 ...6,余数是6,表示这一天是。这是符合事实的。上面的公式(1)虽然很精确,但是计算出来的数字太大,使用起来不方便。仔细想想。其实这个间隔天数W的目的只是为了得到除以7后的余数。这启发了我们是否可以通过找到一个与它余数相同的更小的数来简化这个w值。在数论方面,我们仍然可以通过寻找一个较小的正整数与其同余来计算出精确的周数。很明显,W之所以这么大,是因为公式中的第一项(Y-1)*365太大了。实际上,(Y-1)* 365 =(Y-1)*(364+1)=(Y-1)*(7 * 52+1)= 52 *(Y)。这种关系可以表示为:(y-1) * 365 ≡ y-1 (mod 7),其中≡是数论中同余的符号,mod 7表示以7为模数(即除数)时≡符号两边的数是同余的。所以可以用(Y-1)代替(Y-1)*365,于是我们得到了著名的也是最常见的计算星期几的公式:w = (y-1)+[(y-1)/4。有没有可能直接用月数和日期来计算?答案也是肯定的。让我们看看每个月的天数。列表如下:月份:65438+10月,2月,3月,4月,5月,7月,8月,9月,65438+10月,65438+2月-。-Days:3128(29)313031303130313031如果这些天全部减去28(=4*7),W除以7不受影响。于是我们得到另一个表:月:65438+十月,二月,三月,四月,五月,六月,七月,八月,九月,165438+十月,65438+二月-。-剩余天数:3 0(1) 323232323平均年累计:3368 1131619 21242629闰年累计:3479 121720。仔细观察会发现,3月到7月这五个月里,除了1和2月,其余的日子都是3,2,3,2,3。8月到65438+2月这五个月的天数也是3,2,3,2,3,只是重复而已。在对应的累计天数中,下个月的累计天数与上个月的累计天数之差减去28就是这个重复。正是因为这个规律,平年和闰年的累计天数可以很容易地用数学公式表示出来:╭d;;(当m = 1)d = { 31+d;(当m = 2时)(3)╰[13 *(M+1)/5]-7+(M-1)* 28+d+I .(当M≥3时)其中[...]仍意为仅。m和d分别是要计算的月和日;平年I=0,闰年i=1。对于M≥3的表达式,需要说明一下:[13*(M+1)/5]-7是上面第二个表中的年平均累计值,加上(M-1)*28是你要计算的那一天的月份之前所有月份的总天数。这是一个非常巧妙的通过整数运算实现3,2,3,2,3循环的方法。例如,对于2004年5月1,有:d =[13 *(5+1)/5]-7+(5-1)* 28+1 =如果,以更灵活的方式,我们把65438+10月和2月看作上一年的“65438+3月”和“65438+4月”,不仅仍然符合这个公式,而且公式简化为:d =[13 *(m+1)/5]-7+(m-1)* 28+d .(3≤m≤14)(4)上述计算星期几的公式,可以进一步简化为:w =(y-1)+[(y-1)/4]-[(y-1)/6543828+d .因为-7和(M-1)*28都可以被7整除,所以如果去掉这两项,W除以7的余数不变。公式变成:w =(Y-1)+[(Y-1)/4]-[(Y-1)/100]+[(Y-1)/400]+[需要注意的是,65438+10月和2月已经被视为前一年的65438+3月和65438+4月,所以在计算65438的星期时例如,2004年6月65438+10月1是一个星期四。如果用这个公式,有:w =(2003-1)+[(2003-1)/4]-[(2003-1)/100]+[(2003-1)]2524/7 = 360...4.这是符合实际的。公式(5)已经是由年、月、日计算星期几的公式,但还不是最简洁的,还有改进的处理年的方法。让我们用这个公式来计算每个世纪第一年三月1的那一周,如下:年份:1 (401,801,…,2001)101(5065438)2101)。01(601,1001,…,2201) 301(701,101,…,2301)——如果我们取3月301的周数(706438(6)公式中,c是本世纪的世纪数减一,mod代表模运算,即求余数。例如,对于3月1,20065438,且C=20,则:W = (4-20mod4) * 2-4 = 8-4 = 4。将式(6)代入式(5),变换后可用:(y-1)+[(y-1)/4]-[(y-1)/100]+[(y-1)/400]8801。公式(5)中的(y-1)+[(y-1)/4]-[(y-1)/100]+[(y-1)/400]。这个公式的写法如下:w =(4-c mod 4)* 2-1+[13 *(m+1)/5)+d .(8)有了每个世纪第一年的日期和星期的计算公式,就很容易得到本世纪其他年份的日期和星期的计算公式。因为在一个世纪里,以00结尾的年份就是最后一年,不需要考虑“闰一百年,闰四百年”的规律,只需要考虑“闰四年”的规律。模仿将公式(1)简化为公式(2)的方法,我们很容易从公式(8)得到比公式(5)更简单的计算任意一天的日期的公式:w =(4-c mod 4)* 2-1+(y-1)。如果考虑模运算不是四则运算,可以进一步把(4-C mod 4) * 2改写成只包含四则运算的表达式。因为世纪的商q减去一个C除以四和余数r之间有一个关系:4q+r = C,其中r是C mod 4,所以,是的:r = c-4q = c-4 * [c/4]。(10)那么(4-c mod 4)* 2 =(4-c+4 *[c/4])* 2 = 8-2c+8 *[c/4]。。(11)将公式(11)代入(9),得到:w =[c/4]-2c+y+[y/4]+[13 *(m+1)/5]+d-1。(12)这个公式是世纪数减一,年末两位数。唯一需要改变的是,把65438+10月和2月当作前一年的65438+3月和65438+4月,C和Y都按前一年的年份取。因此,一般认为这是计算任意一天的星期几的最佳公式。这个公式最早是由德国数学家克里斯蒂安·泽勒(1822-1899)在1886年推导出来的,所以俗称泽勒公式。为方便口算,公式中的[13 * (M+1)/5]常写成[26 * (M+1)/10]。现在我们还是算2004年5月1的那一周。很明显,C=20,y=4,M=5,d=1,代入乐彩公式,就是:W = [20/4]-40+4+1+[65438]为了计算方便,我们可以加上7的整数倍,使之成为正数,比如加70得到55。除以7,剩下的6表示这一天是星期六。这与实际情况和公式(2)计算的结果是一致的。最后需要注意的是,以上公式都是基于公历的闰法则。对于儒略历,乐彩也推导出了相应的公式:W = 5-C+Y+[Y/4]+[13 *(M+1)/5]+D-1。(13).这样,我们终于一劳永逸了。参考资料:

/30137.html