久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4015|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

新編萬年歷星期速算法(自制版)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:51090 發(fā)表于 2014-10-13 14:19 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
                                                                                                算法實(shí)現(xiàn):
uint16 CalcWeekDay(uint16 year,uint16 month,uint16 day) {
    uint8 deviationChart[14] = {4,0,0,3,5,1,3,6,2,4,0,2,3,6}; //保存了通同星期偏差表(閏年和平年),具體可以查看下面
    if( (year%400==0) || (((year%100)/4==0) && ((year%100)!=0)) ) {//如果是閏年,則交換閏年的1、2月和平年1、2月的偏差值
        deviationChart[0] = deviationChart[12];
        deviationChart[1] = deviationChart[13];
    }
    return (((year/100)%4*5 + (year%100) + (year%100)/4 +deviationChart[month-1] + day +2)%7);
}
其中:
    uint16代表2字節(jié)無符號(hào)整數(shù)空間(0~65535)
    uint8代表1字節(jié)無符號(hào)整數(shù)空間(0~255)
復(fù)雜度:
    時(shí)間復(fù)雜度:O(1)
    空間復(fù)雜度:O(1)
作用:
    能查找公元0000年1月1日至公元9999年12月31日中的任何一天是星期幾,可以說是真正的萬年歷
總結(jié):
    靠,為了實(shí)現(xiàn)這個(gè)算法,發(fā)了我2個(gè)多小時(shí),簡(jiǎn)直是一步一步調(diào)試過來的,要是哪天我也能相當(dāng)順利地游走于算法,就好了。算法是計(jì)算機(jī)效率的核心啊..



原理:
新編萬年歷星期速算法(HotPower 2004.6.2)
推導(dǎo)過程:
1。平年365天(52周+1天),閏年366天(52周+2天)。平年2月28天,閏年2月29天。
   由于公元1月1日設(shè)為星期六,故3月1日為星期三。         ——注意這個(gè)“三”
   為使算法達(dá)到最簡(jiǎn),故本算法以“星期”為計(jì)算單位。且選3月1日為基月。
2。每400年整一閏,或每4年且不為百年的一閏。
   百年%4=0閏或(年%4=0并且年<>0)閏。
3。每 4年(3個(gè)平年+1個(gè)閏年)共208周+5天                  ——注意這個(gè)“5天”
   每百年共100*(208周+5天)-1天=5217周+5天              ——注意這個(gè)“5天”(整百年暫設(shè)為平年)
   每400年共4*(5217周+5天)+1天(整400年閏)=20871周+0天——注意這個(gè)“0天”和“1天”(4個(gè)整百年只有一個(gè)閏年)
   即400年一輪回。ㄔ瓉砣f年歷400年前是一家)
4。萬年3月1日星期算法(記住那個(gè)三)
   公式:某年3月1日星期幾=(3天+百年%4*5天+年/4*5天+年%4+月星期表+日-1天)%7
         某年3月1日星期幾=(百年%4*5天+年/4*5天+年%4+月星期表+日+2天)%7
   或    某年3月1日星期幾=(百年%4*5天+年+年/4+月星期表+日+2天)%7
   
   閏4百年3月1日星期算法(百年%4=0)
   公式:某年3月1日星期幾=(年+年/4+月星期表+日+2天)%7
   例:0000年3月1日星期幾=(0+0/4+0+1+2)%7=3%7=星期三
       1600年3月1日星期幾=(0+0/4+0+1+2)%7=3%7=星期三
       2000年3月1日星期幾=(0+0/4+0+1+2)%7=3%7=星期三
       2001年3月1日星期幾=(1+1/4+0+1+2)%7=4%7=星期四
       2004年3月1日星期幾=(4+4/4+0+1+2)%7=8%7=星期一
       2008年3月1日星期幾=(8+8/4+0+1+2)%7=13%7=星期六
       2042年3月1日星期幾=(42+42/4+0+1+2)%7=55%7=星期六
   平4百年3月1日星期算法(百年%4<>0)
   公式:某年3月1日星期幾=(百年%4*5天+年+年/4+月星期表+日+2天)%7
   例:1700年3月1日星期幾=(17%4*5+0+0/4+0+1+2)%7=8%7=星期一(注意:1700年是平年)
       1800年3月1日星期幾=(18%4*5+0+0/4+0+1+2)%7=13%7=星期六(注意:1800年是平年)
       1900年3月1日星期幾=(19%4*5+0+0/4+0+1+2)%7=18%7=星期四(注意:1900年是平年)
       1901年3月1日星期幾=(19%4*5+1+1/3+0+1+2)%7=19%7=星期五
       1918年3月1日星期幾=(19%4*5+18+18/4+0+1+2)%7=(15+22+3)%7=40%7=星期五
       1958年3月1日星期幾=(19%4*5+58/4*5+58%4+3)%7=(15+70+2+3)%7=90%7=星期六
       1988年3月1日星期幾=(19%4*5+88/4*5+88%4+3)%7=(15+110+0+3)%7=128%7=星期二
       1999年3月1日星期幾=(19%4*5+99/4*5+99%4+3)%7=(15+120+3+3)%7=141%7=星期一
       2100年3月1日星期幾=(21%4*5+0/4*5+0%4+3)%7=(5+0+0+3)%7=8%7=星期一(注意:2100年是平年)
       2101年3月1日星期幾=(21%4*5+1/4*5+1%4+3)%7=(5+0+1+3)%7=9%7=星期二
       2102年3月1日星期幾=(21%4*5+2/4*5+2%4+3)%7=(5+0+2+3)%7=10%7=星期三
       2103年3月1日星期幾=(21%4*5+3/4*5+3%4+3)%7=(5+0+3+3)%7=11%7=星期四
       2104年3月1日星期幾=(21%4*5+4/4*5+4%4+3)%7=(5+1+0+3)%7=9%7=星期二(注意:2104年是閏年)
       9999年3月1日星期幾=(99%4*5+99/4*5+99%4+3)%7=(120+15+3+3)%7=141%7=星期一   
    注:按400年一輪回!(400年前是一家)的說法
       1600年,2000年是一樣的
       1700年,2100年是一樣的
       1800年,2200年是一樣的
       1900年,2300年是一樣的
       所以,萬年歷實(shí)際上是騙人的,應(yīng)該叫“四百年歷”才是。萬只是多的意思罷了。
5。萬年某日星期算法  
   公式:某日星期幾=(百年%4*5天+年+年/4+月星期表+日+2天)%7
   通同星期偏差表
   閏年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
   天數(shù)   31  29  31  30  31  30  31  31  30  31   30   31
   星期   3   6   0   3   5   1   3   6   2   4    0    2
   平年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
   天數(shù)   31  28  31  30  31  30  31  31  30  31   30   31
   星期   4   0   0   3   5   1   3   6   2   4    0    2

6。2004年世上最“弱智”的算法
   先復(fù)習(xí)以上算法,取公式:
   某年某日星期幾=(百年%4*5天+年+年/4+月星期表+日+2天)%7
   通同星期偏差表(閏年表)
        1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
   天數(shù)  31  29  31  30  31  30  31  31  30  31   30   31
   星期  3   6   0   3   5   1   3   6   2   4    0    2
   將2004年代入。得(其中百年=20,年=04)
   2004某日星期幾=(20%4*5天+4+4/4+月星期表+日+2天)%7
             =(0*5天+4天+1天+月星期表+日+2天)%7
             =(5天+月星期表+日+2天)%7
         =(7天+月星期表+日)%7
         =(月星期表+日)%7
         =(月星期表%7+日%7)%7
   所以,2004年的算法最簡(jiǎn)單,幾乎不用計(jì)算。
7,F(xiàn)以今年的重大節(jié)日為例:
   2004年元旦    1月表=3  1日=1  故3+1=4 即2004年元旦是星期四
   2004年春節(jié)    1月表=3 22日=1  故3+1=4 即2004年春節(jié)是星期四
   2004年元宵節(jié)  2月表=6  5日=5  故6+5=4 即2004年元宵節(jié)是星期四            
   2004年婦女節(jié)  3月表=0  8日=1  故0+1=1 即2004年婦女節(jié)是星期一            
   2004年植樹節(jié)  3月表=0 12日=5  故0+5=5 即2004年植樹節(jié)是星期五            
   2004年投訴節(jié)  3月表=0 15日=1  故0+1=1 即2004年投訴節(jié)是星期一
   2004年清明節(jié)  4月表=3  4日=4  故3+4=0 即2004年清明節(jié)是星期天
   2004年五一節(jié)  5月表=5  1日=1  故5+1=6 即2004年五一節(jié)是星期六
   2004年青年節(jié)  5月表=5  4日=4  故5+4=2 即2004年青年節(jié)是星期二
   2004年母親節(jié)  5月表=5  9日=2  故5+2=0 即2004年母親節(jié)是星期天
   2004年兒童節(jié)  6月表=1  1日=1  故1+1=2 即2004年兒童節(jié)是星期二
   2004年端午節(jié)  6月表=1 22日=1  故1+1=2 即2004年端午節(jié)是星期二
   2004年建黨節(jié)  7月表=3  1日=1  故3+1=4 即2004年建黨節(jié)是星期四
   2004年建軍節(jié)  8月表=6  1日=1  故6+1=0 即2004年建軍節(jié)是星期天
   2004年父親節(jié)  8月表=6  8日=1  故6+1=0 即2004年父親節(jié)是星期天
   2004年教師節(jié)  9月表=2 10日=3  故2+3=5 即2004年教師節(jié)是星期五
   2004年中秋節(jié)  9月表=2 28日=0  故2+0=2 即2004年中秋節(jié)是星期二
   2004年國(guó)慶節(jié) 10月表=4  1日=1  故4+1=5 即2004年國(guó)慶節(jié)是星期五
   2004年老人節(jié) 10月表=4  6日=6  故4+6=3 即2004年老人節(jié)是星期三
   2004年重陽(yáng)節(jié) 10月表=4 22日=1  故4+1=5 即2004年重陽(yáng)節(jié)是星期五
   2004年立冬節(jié) 11月表=0  7日=7  故0+7=0 即2004年立冬節(jié)是星期天
   2004年冬至節(jié) 12月表=2 21日=0  故2+0=2 即2004年冬至節(jié)是星期二
8。二十世紀(jì)任意日期舉例(19%4*5=15)
   公式:某日星期幾=(百年%4*5天+年+年/4+平年月星期表+日+2天)%7
                   =(19%4*5天+年+年/4+平年月星期表+日+2天)%7
                   =(15天+年+年/4+平年月星期表+日+2天)%7
   即:  某日星期幾=(年+年/4+平年月星期表+日+3天)%7
   1900年元旦      1日=(0/4*5+0%4+1+3)%7=(0+0+4)%7=4
                   1月表=4(平年)    故 4+4=1 即1900年元旦是星期一
   1918年大寒     21日=(18/4*5+18%4+21+3)%7=(20+2+24)%7=4
                   1月表=4(平年)    故 4+4=1 即1918年春節(jié)是星期一
   1918年春節(jié)     11日=(18/4*5+18%4+11+3)%7=(20+2+14)%7=1
                   2月表=0(平年)    故 0+1=1 即1918年春節(jié)是星期一
   1927年元旦      1日=(27/4*5+27%4+1+3)%7=(30+3+4)%7=2
                    1月表=4(平年)    故 4+2=6 即1927年元旦是星期六
   1948年臘八節(jié)   18日=(48/4*5+48%4+18+3)%7=(60+21)%7=4
                   1月表=3(閏年)    故 3+4=0 即1927年元旦是星期天
   1949年國(guó)慶      1日=(49/4*5+49%4+1+3)%7=(60+1+4)%7=2
                   10月表=4(平年)    故 4+2=6 即1949年國(guó)慶是星期六
   1962年勞動(dòng)節(jié)    1日=(62/4*5+62%4+1+3)%7=(75+2+4)%7=4
                    5月表=5(平年)    故 5+4=2 即1962年勞動(dòng)節(jié)是星期二
   1999年12月31日 31日=(99/4*5+99%4+31+3)%7=(120+3+34)%7=3
                   12月表=2(平年)    故 2+3=5 即1999年12月31日是星期五
9.二十一世紀(jì)新千年蟲算法(20%4*5=0)
   公式:某日星期幾=(百年%4*5天+年+年/4+閏年月星期表+日+2天)%7
                   =(20%4*5天+年+年/4+閏年月星期表+日+2天)%7
   即:  某日星期幾=(年+年/4+閏年月星期表+日+2天)%7
   2000年元旦      1日=(0+0/4+1+2)%7=(0+0+1+2)%7=3
                   1月表=3(閏年)    故 3+3->6 即2027年元旦是星期六
   2018年大寒     20日=(18+18/4+20+2)%7=(18+4+20+2)%7=2
                   1月表=4(平年)    故 4+2->6 即2018年大寒是星期六
   2018年春節(jié)     16日=(18+18/4+16+2)%7=(18+4+16+2)%7=5
                   2月表=0(平年)    故 0+5=5 即2018年春節(jié)是星期五
   2027年元旦      1日=(27+27/4+1+2)%7=(3+30+3)%7=1
                   1月表=4(平年)    故 4+1=5 即2027年元旦是星期五
   2048年臘八節(jié)   22日=(48/4*5+48%4+22+2)%7=(60+24)%7=0
                   1月表=3(閏年)    故 3+0=3 即2027年臘八是星期三
   2099年12月31日 31日=(99/4*5+99%4+31+2)%7=(120+3+33)%7=2
                  12月表=2(平年)    故 2+2=4 即2099年12月31日是星期四
10。二十二世紀(jì)任意日期舉例(21%4*5=5)(接縫驗(yàn)證)
   公式:某日星期幾=(百年%4*5天+年+年/4+平年月星期表+日+2天)%7
                   =(21%4*5天+年+年/4+平年月星期表+日+2天)%7
                   =(5天+年+年/4+平年月星期表+日+2天)%7
   即:  某日星期幾=(年+年/4+平年月星期表+日)%7
  2100年元旦      1日=(0/4*5+0%4+1)%7=(0+0+1)%7=1
                 1月表=4(平年)    故 4+1=4 即2100年元旦是星期五
  2100年1月31日  31日=(0/4*5+0%4+31)%7=(0+0+31)%7=3
                 1月表=4(平年)    故 4+3=0 即2100年1月31日是星期天
  2100年2月1日    1日=(0/4*5+0%4+1)%7=(0+0+1)%7=1
                 2月表=0(平年)    故 0+1=1 即2100年2月1日是星期一
  2100年2月28日  28日=(0/4*5+0%4+28)%7=(0+0+28)%7=0
                 2月表=0(平年)    故 0+0=0 即2100年2月28日是星期天
  2100年3月1日    1日=(0/4*5+0%4+1)%7=(0+0+1)%7=1
                 3月表=0(平年)    故 0+1=1 即2100年3月1日是星期一
  2100年3月31日  31日=(0/4*5+0%4+31)%7=(0+0+31)%7=3
                 3月表=0(平年)    故 0+3=3 即2100年3月31日是星期三
  2100年12月31日 31日=(0/4*5+0%4+31)%7=(0+0+31)%7=3
                 12月表=2(平年)    故 2+3=5 即2101年12月31日是星期五
  2101年元旦      1日=(1/4*5+1%4+1)%7=(0+1+1)%7=2
                 1月表=4(平年)    故 4+2=6 即2101年元旦是星期六
  2101年1月31日  31日=(1/4*5+1%4+31)%7=(0+1+31)%7=4
                 1月表=4(平年)    故 4+4=1 即2101年1月31日是星期一
  2101年2月1日    1日=(0/4*5+1%4+1)%7=(0+1+1)%7=2
                 2月表=0(平年)    故 0+2=2 即2101年2月1日是星期二
  2101年2月28日  28日=(0/4*5+1%4+28)%7=(0+1+28)%7=1
                 2月表=0(平年)    故 0+1=1 即2101年2月28日是星期一
  2101年3月1日    1日=(0/4*5+1%4+1)%7=(0+1+1)%7=2
                 3月表=0(平年)    故 0+2=2 即2101年3月1日是星期二
  2101年3月31日  31日=(0/4*5+1%4+31)%7=(0+1+31)%7=4
                 3月表=0(平年)    故 0+4=4 即2101年3月31日是星期四
  2101年12月31日 31日=(0/4*5+1%4+31)%7=(0+1+31)%7=4
                 12月表=2(平年)    故 2+4=6 即2101年12月31日是星期六
  2104年2月29日  29日=(0/4*5+1%4+29)%7=(0+1+29)%7=2
                 2月表=6(閏年)    故 6+2=1 即2104年2月29日是星期一
  2104年3月1日    1日=(0/4*5+1%4+1)%7=(0+1+1)%7=2
                 3月表=0(閏年)    故 0+2=2 即2104年3月1日是星期二
  2199年12月31日 31日=(99/4*5+99%4+31)%7=(120+3+31)%7=0
                 12月表=2(平年)    故 2+0=2 即2199年12月31日是星期二



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 怡红院怡春院一级毛片 | 国产视频二区在线观看 | 成人h动漫精品一区二区器材 | 欧美 视频 | 在线欧美小视频 | 亚洲一区二区三区在线播放 | 久久久精品视频免费看 | 久久久成人一区二区免费影院 | 国产精品污www在线观看 | 日韩中文一区二区三区 | 国产精品视频网址 | 亚洲天堂av网 | 特黄特色大片免费视频观看 | 99精品视频一区二区三区 | 中文字幕视频在线 | 成人黄色av网址 | 美女久久| 国产高清免费视频 | 亚洲欧美视频一区二区 | 国产精品视频久久久 | 国产福利91精品 | 亚洲精品久久久久久久久久吃药 | zzzwww在线看片免费 | 亚洲人成人网 | 日韩精品久久 | 免费二区| 91一区二区三区在线观看 | 亚洲毛片 | 亚洲男女激情 | 日本在线免费看最新的电影 | 日韩一区二区三区在线看 | 最新日韩欧美 | 亚洲 中文 欧美 日韩 在线观看 | 99久久婷婷国产综合精品电影 | 日本在线看片 | 亚av在线 | 在线免费小视频 | 美女国产精品 | 蜜臀久久99精品久久久久久宅男 | 欧美婷婷| 亚洲一区中文 |