En vanlig algoritm för beräkning av dagen i veckan i ett särskilt datum är Zeller algoritm . Algoritmen publicerades 1882 och syftar till att bearbetas för hand , men kan enkelt implementeras i programvara . Zeller algoritm fungerar genom att hitta veckodag seklet började , sedan bygga därifrån genom att lägga till år , månader och dagar . En god förståelse av modulo aritmetik är nödvändigt att förstå hur algoritmen fungerar, men vem som helst kan genomföra det genom att följa instruktionerna
1 .
Förbered ingångar . Algoritmen förväntar sig en dag, månad och år .
Zeller algoritm nummer månaderna från tre till 14 , med början i mars och slutar med februari . Detta garanterar att språng dagar infaller alltid i slutet av året , vilket förenklar beräkningarna .
om månad <3 sedan , månad=månad + 12
2 .
Beräkna talet och år av århundradet . Det talet för 1950 bör vara 19 , även om den faller i det tjugonde århundradet .
talet=golv (år /100 )
yearOfCentury=år mod 100
3 .
Hitta dag i veckan som talet inleddes .
dayOfWeek=golv ( talet /4 ) + 5 * talet
Zeller fastställt att denna beräkning modulo sju, kommer att ge veckodag att varje talet inleddes . Golvet Beräkningen hanterar det faktum att var fjärde århundradet är kort en skottdagen .
4 .
Beräkna veckodag att året startade den.
dayOfWeek=dayOfWeek + yearOfCentury + golv ( yearOfCentury /4 )
Varje år börjar nästa dag i veckan än föregående år , med undantag för skottår . Denna beräkning , modulo sju, ger veckodag den första dagen på året .
5 .
Hitta dag i veckan att månaden började på .
dayOfWeek=dayOfWeek + golv ( ( månad + 1 ) * 26 ) /10 )
Detta är hjärtat av Zeller algoritm . Zeller konstaterade att denna beräkning kan avgöra på vilken dag i veckan en månad startar . Det eliminerar behovet av uppslagstabeller för att fastställa längden på varje månad .
6 .
Tillsätt dagen i månaden och beräkna dagen i veckan då det infaller .
dayOfWeek=dayOfWeek + dag
dayOfWeek=dayOfWeek mod 7
7 .
Omvandla datum till ISO- standarder vecka datum .
ISO vecka datum dag-för-veckor börjar med måndag=1 . Zeller algoritm använder Lördag=0 . Omvandlingen använder enkla modulo aritmetik .
dayOfWeek=( ( dayOfWeek + 5 ) mod 7 ) + 1
Previous:nothing Next:hur man vända en enda länkad lista