Contacte

Câte luni au trecut între două întâlniri. Cum se calculează numărul de zile dintr-o lună folosind o formulă matematică? Câte zile sunt între date? Instrucțiuni

Notă: această postare este o traducere a articolului cmcenroe.me/2014/12/05/days-in-month-formula.html ( Partea I), precum și adăugirea autorului la acesta ( Partea a II-a). Nu trebuie să luați materialul în serios, ci mai degrabă ca o încălzire a minții, care nu necesită altceva decât cunoștințe școlare de aritmetică și care nu au aplicație practică... Lectură fericită, tuturor!

Partea I

Introducere

Recent, după o altă noapte nedormită, mă gândeam la metode de memorare a numărului de zile din fiecare lună a anului. Pentru aceasta există o mașină de numărat, precum și o modalitate de a conta pe articulații, dar nici unul, nici celălalt nu mi s-au potrivit. M-am întrebat dacă există un fel de formulă matematică pentru rezolvarea unei astfel de probleme și - nemaiavând una cu un studiu superficial - m-am provocat să o creez.

Formalizarea Cu alte cuvinte, este necesar să se găsească funcția f astfel încât valoarea f (x) pentru fiecare lună X, reprezentat printr-un număr între 1 și 12, este egal cu numărul de zile din luna respectivă. Tabel cu valori ale argumentului și funcției:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x) 31 28 31 30 31 30 31 31 30 31 30 31

Dacă doriți să încercați singur înainte de a citi soluția mea, atunci este momentul. Dacă preferați să vedeți imediat un răspuns gata, atunci uitați-vă sub spoiler.

Răspuns


Mai jos sunt pașii mei pentru a găsi o soluție.

Aparat matematic

În primul rând, să ne reîmprospătăm pe scurt memoria a doi operatori vitali în rezolvarea acestei probleme: diviziunea întregi și restul diviziunii.

Diviziunea întregi este un operator utilizat în multe limbaje de programare atunci când se împarte două numere întregi și se elimină coeficientul parte fracționată... Îl voi înfățișa ca. De exemplu:

Restul diviziei este un operator care găsește restul unei diviziuni. Multe limbaje de programare folosesc simbolul % , dar voi folosi construcții ale formei, de exemplu:

Rețineți că restul diviziunii are aceeași prioritate ca diviziunea.

Cele elementare

Deci, să aplicăm aparatul nostru matematic pentru a obține formula de bază. Într-o lună obișnuită, există 30 sau 31 de zile, deci putem folosi 1 sau 0 pentru a obține alternativ și apoi adăugăm o constantă la acest număr:

Obținem tabelul, valorile corecte sunt evidențiate cu aldine:
X 1 2 3 4 5 6 7 8 9 10 11 12
f (x) 31 30 31 30 31 30 31 30 31 30 31 30

Frumos început! Există deja valori corecte pentru ianuarie și pentru lunile martie-iulie inclusiv. Februarie este un caz special și ne vom ocupa de el puțin mai târziu. După luna iulie, pentru lunile rămase, ordinea de a obține 0 și 1 trebuie inversată.
Pentru a face acest lucru, putem adăuga 1 la dividend:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x) 30 31 30 31 30 31 30 31 30 31 30 31

Acum valorile corecte sunt din august până în decembrie, dar așa cum era de așteptat, valorile pentru celelalte luni sunt incorecte. Să vedem cum putem combina aceste formule.

Suprapunerea măștii

Acest lucru necesită o funcție definită în bucăți, dar - deoarece mi s-a părut plictisitor - m-am gândit la o altă soluție, folosind o parte a funcției într-un interval, cealaltă în altul.
Cred că este cel mai ușor să găsești o expresie care să fie egală cu 1 într-o aplicație și 0 în rest. Metoda prin care, înmulțind un argument cu o expresie, îl excludem din formula din afara sferei de aplicare a acestuia, am numit „mascare”, deoarece acest comportament este similar cu un fel de mască de biți.
Pentru a utiliza această metodă în ultima parte a funcției noastre, trebuie să găsiți o expresie egală cu 1 pentru și - din moment ce valorile argumentelor sunt întotdeauna mai mici de 16 - împărțirea numărului întreg la 8 este în regulă.
X 1 2 3 4 5 6 7 8 9 10 11 12
X ⁄ 8 ⌋ 0 0 0 0 0 0 0 1 1 1 1 1

Acum, folosind această mască, folosind expresia în loc de 1 în dividend, putem înlocui ordinea obținerii 0 și 1 a formulei cu opusul:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x) 31 30 31 30 31 30 31 31 30 31 30 31

Eureka! Totul este corect, cu excepția lunii februarie. Surpriza surpriza.

februarie

Orice lună are 30 sau 31 de zile, cu excepția lunii februarie cu 28 (anul bisect este în afara domeniului acestei probleme). În prezent, conform formulei noastre, are 30 de zile, deci ar fi bine să scădem expresia egală cu 2 la.
Cel mai bun lucru cu care am venit este acest lucru, care se maschează toate lunile după februarie:
X 1 2 3 4 5 6 7 8 9 10 11 12
2 mod X 0 0 2 2 2 2 2 2 2 2 2 2

Schimbând constanta de bază la 28, adăugând 2 la restul lunilor, obținem formula:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x) 29 28 31 30 31 30 31 31 30 31 30 31

Din păcate, ianuarie este acum cu 2 zile mai scurt. Din fericire, este ușor să obțineți o expresie care se aplică numai în prima lună: este inversul numărului rotunjit în jos. Înmulțind-o cu 2 obținem formula finală:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x) 31 28 31 30 31 30 31 31 30 31 30 31

Postfaţă

Iată - o formulă pentru obținerea numărului de zile în orice lună a anului, folosind cea mai simplă aritmetică. Data viitoare când vă amintiți câte zile sunt în septembrie, pur și simplu faceți acest lucru cu această funcție JavaScript cu o singură linie:

Funcția f (x) (returnează 28 + (x + Math.floor (x / 8))% 2 + 2% x + 2 * Math.floor (1 / x);)

Partea a II-a

Introducere

În prima parte, a fost obținută o formulă scurtă și chiar ușor elegantă, ale cărei avantaje principale sunt simplitatea aparatului matematic, absența ramurilor și a expresiilor condiționate și laconicismul. Dezavantajele - în afară de faptul că nu îl veți folosi în proiect - includ lipsa de validare pentru viscoconut și anii non-bisectivi.
Prin urmare, mi-am pus sarcina de a crea o funcție f astfel încât valoarea f (x, y) pentru fiecare lună X reprezentat de un număr de la 1 la 12 și un an y mai mare de 0 este egal cu numărul de zile dintr-o lună Xîn anul y.
Pentru cei nerăbdători, există un răspuns gata sub spoiler, în timp ce restul sunt rugați să mă urmărească.

Răspuns

Restul diviziei: modși ⌊⌋

Pentru claritate vizuală, să fim de acord că în unele formule operatorul de diviziune cu rest este înlocuit cu paranteze inferioare, unde mi s-a părut necesar:

An bisect

Într-un an bisect, se introduce o zi calendaristică suplimentară: 29 februarie. După cum știți, un an bisect este un multiplu de 4 și nu un multiplu de 100 sau un multiplu de 400. Să scriem expresia identică cu această afirmație:

Pentru a converti această expresie într-una algebrică, este necesar să se aplice o injecție a formei la rezultatul expresiei:

Ceea ce vă va permite să obțineți 1 când împărțiți fără rest și 0 când împărțiți cu un rest, pentru a-l utiliza în formula pentru determinarea numărului de zile într-o lună.

Ca o funcție g " puteți folosi 1 minus rest pentru:

X 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
g "(x) Infinit 1 0 0 0 0 0 0 0 0 0 0 0 0 0

Este ușor de văzut că, mărind dividendul și divizorul cu 1, obținem formula corectă pentru:
X 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
g "(x) 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Astfel, expresia va fi scrisă ca:


Și scriem expresia ca:

Aplicând această abordare, obținem următoarea funcție g (y), a cărui valoare va fi 1 dacă anul este bisect sau 0 altfel:

y 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000
g (y) 0 0 1 0 0 0 1 0 0 0 1
y 2000 2100 2200 2300 2400 2500 2600 2700 2800 2900 3000
g (y) 1 0 0 0 1 0 0 0 1 0 0

Anii bisecți sunt îndrăzneți.

Vă reamintesc că, în cadrul acordului acceptat, operatorul pentru obținerea restului diviziunii poate fi descris ca fiind modși ⌊⌋.

Suprapunerea măștii

În formulă, partea este un amendament care adaugă 2 zile la ianuarie. Dacă eliminăm factorul 2 și înlocuim 1 cu 2 în numărător, atunci această formulă va adăuga 2 zile la ianuarie și 1 zi la februarie, ceea ce ne oferă cheia adăugării unei zile într-un an bisect. Pentru claritate, folosim valoarea intermediară din formulă g (y) si ca y folosim 2000 (salt) și 2001 (fără salt) ani:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x, 2000) 31 29 31 30 31 30 31 31 30 31 30 31
f (x, 2001) 30 28 31 30 31 30 31 31 30 31 30 30

Valorile pentru toate lunile, cu excepția lunii ianuarie a unui an non-bisect, sunt corecte.

Pentru a corecta această neînțelegere enervantă, adăugați o zi la ianuarie cu formula pe care o cunoaștem deja:


Sau:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x, 2000) 31 29 31 30 31 30 31 31 30 31 30 31
f (x, 2001) 31 28 31 30 31 30 31 31 30 31 30 30

Concluzie

Ca rezultat, se obține o formulă mult mai greoaie, dar mai universală, care poate fi folosită și pentru a obține numărul de zile dintr-o lună a unui anumit an:

Funcția f (x, y) (returnează 28 + ((x + Math.floor (x / 8))% 2) + 2% x + Math.floor ((1 + (1 - (y% 4 + 2)% (y% 4 + 1)) * ((y% 100 + 2)% (y% 100 + 1)) + (1 - (y% 400 + 2)% (y% 400 + 1))) / x) + Math.floor (1 / x) - Math.floor (((1 - (y% 4 + 2)% (y% 4 + 1)) * ((y% 100 + 2)% (y% 100 + 1 )) + (1 - (y% 400 + 2)% (y% 400 + 1))) / x);)
Exemplu în C # ideone.com/fANutz.

1 ... Nu știu cum să folosesc astfel de mnemonice, așa că am spionat semnul de pe Internet.
2 ... „Noțiunile de bază” sau „Regula cu multe excepții”, la fel ca majoritatea regulilor.
3 ... Inițial, februarie a fost ultima lună a anului în calendarul roman, deci există o logică prin aceea că este mai scurtă decât toate celelalte. Există, de asemenea, logică în adăugarea sau eliminarea unei zile la sfârșitul anului, astfel încât lungimea sa este variabilă.

Actualizare. unu:
O traducere alternativă a primei părți în

Calculator online gratuit Kontur. Contabilitatea vă va ajuta și vă va spune câte zile au trecut între două date specificate. În plus, dacă aveți nevoie, puteți calcula câte calendare, zile libere sau zile lucrătoare (ore) conține perioada specificată a unui an sau câțiva ani.

Câte zile sunt între date? Instrucțiuni

Trebuie doar să setați o zi specifică de început și sfârșit și într-o fracțiune de secundă veți obține calculul. Calculatorul online calculează toate datele independent. Dacă modificați zilele inițiale ale săptămânii, rezultatul este recalculat automat ținând cont de anul bisect.

Important: nu puteți lua din calculele din anii precedenți indicatorii zilelor / orelor de lucru pe lună și să le furnizați ca calcule - datele vor diferi. Prin urmare, este mai bine să folosiți un calculator.

Deci, ordinea acțiunilor:

  1. În câmpurile „Data de începere” și „Data de încheiere”, selectați ziua de începere și, respectiv, de sfârșit a numărătoare inversă, începând din 2013 și terminând în viitorul 2018.
  2. Setați în câmpul următor numărul de ore de lucru pe zi. În mod implicit, acest câmp este deja setat la 8 ore (40 de ore săptămână de lucru), dar puteți schimba acest număr.
  3. În partea dreaptă a ecranului, pe banner, veți vedea rezultatul obținut: zile lucrătoare, zile calendaristice și ore de lucru între datele date. Rezultatele trebuie copiate și salvate în documentul dvs.

Pentru ce puteți folosi calculatorul

  1. Pentru calcularea penalităților și a delincvențelor în cadrul contractelor
  2. Cum să înțelegeți eficacitatea utilizării unei resurse și termenele limită pentru utilizare
  3. Cum să nu planifici din greșeală o sarcină pentru un weekend
  4. Cât timp mai rămâne până la termen

Exemplu:

Ești contabil. Managerul v-a cerut în următoarele câteva minute să furnizați date cu privire la numărul de ore de lucru pe care toți angajații companiei ar trebui să le lucreze în februarie. Puteți determina cu ușurință numărul de angajați - aveți numere în fața ochilor. Dar numărul de ore trebuie numărat .... Și câte zile sunt în februarie? Este un an bisect? Ce zile erau zilele libere? Cum se determină numărul de zile de vacanță?

Soluție: utilizați doar widgetul nostru. Veți primi automat toate informațiile, nu aveți nevoie de calendare și calculatoare desktop.

Ți-a plăcut acest calculator? Apoi încercați celelalte posibilități

Doriți să țineți contabilitatea, să trimiteți rapoarte și să faceți calcule într-un serviciu web convenabil și simplu? Încercați Kontur.Counting gratuit timp de 14 zile! Vă vom învăța rapid cum să utilizați serviciul și să vă răspundem la toate întrebările!

Pentru a rezolva unele probleme la crearea unui tabel, trebuie să specificați numărul de zile dintr-o lună într-o celulă separată sau într-o formulă, astfel încât programul să efectueze calculele necesare. Excel are instrumente pentru efectuarea acestei operațiuni. sa luam in considerare căi diferite aplicarea acestei oportunități.

Puteți calcula numărul de zile dintr-o lună în Excel folosind operatori de categorie specială "Data si ora"... Pentru a afla ce opțiune este cea mai bună de aplicat, trebuie mai întâi să stabiliți obiectivele operației. În funcție de aceasta, rezultatul calculului poate fi afișat într-un element separat de pe foaie sau poate fi utilizat în interiorul unei alte formule.

Metoda 1: combinație de operatori DAY și EONMONTH

Cel mai într-un mod simplu pentru a rezolva această problemă este o combinație de operatori ZIși AL SÂNTURILOR.

Funcţie ZI aparține grupului de operatori "Data si ora"... Ea indică un anumit număr din 1 inainte de 31 ... În cazul nostru, sarcina acest operator va exista o indicație ultima zi luni folosind funcția încorporată ca argument AL SÂNTURILOR.

Sintaxa operatorului ZI Următorul:

DAY (date_num_format)

Adică, singurul argument pentru această funcție este „Data în format numeric”... Acesta va fi setat de operator AL SÂNTURILOR... Trebuie spus că data în format numeric este diferită de formatul obișnuit. De exemplu, data 04.05.2017 numeric va arăta ca. 42859 ... Prin urmare, Excel folosește acest format numai pentru operațiuni interne. Este rar folosit pentru afișarea în celule.

Operator AL SÂNTURILOR este destinat să indice numărul ordinal al ultimei zile a lunii, care este un număr specificat de luni înainte sau înapoi de la data specificată. Sintaxa funcției este următoarea:

EONTS (start_date, number_months)

Operator "Data de început" conține data de la care se face numărătoarea inversă sau o referință la celula în care se află.

Operator „Numărul de luni” indică numărul de luni de numărat de la o dată dată.

Acum să vedem cum funcționează exemplu specific... Pentru aceasta luăm Foaie Excel, într-una din celulele din care este inscripționat un anumit număr de calendar. Este necesar, folosind setul de operatori de mai sus, să se determine câte zile sunt în perioada lunară la care se referă acest număr.


Formula generală am luat următoarea formă:

ZI (SĂNĂRI (B3,0))

În această formulă, valoarea variabilei este doar adresa celulei ( B3). Astfel, dacă nu doriți să executați procedura cu Vrăjitori de funcții, puteți insera această formulă în orice element al foii prin simpla înlocuire a adresei celulei care conține numărul cu cea care este relevantă în cazul dvs. specific. Rezultatul va fi similar.

Metoda 2: determinarea automată a numărului de zile

Acum să ne uităm la o altă problemă. Este necesar ca numărul de zile să fie afișat nu conform unei date calendaristice date, ci în funcție de data curentă. În plus, schimbarea perioadelor ar fi făcută automat fără intervenția utilizatorului. Deși pare ciudat, această sarcină este mai ușoară decât cea anterioară. Pentru a o rezolva, chiar deschideți Expertul de funcții nu este necesar deoarece formula care efectuează această operațiune nu conține valori variabile sau referințe de celulă. Puteți pur și simplu introduce următoarea formulă în celula foii unde doriți ca rezultatul să fie afișat fără modificări:

DAY (E-LUNI (AZI (); 0))

Funcția încorporată TODAY pe care am folosit-o în acest caz afișează numărul de astăzi și nu are argumente. Astfel, celula dvs. va afișa în mod constant numărul de zile din luna curentă.

Metoda 3: calcularea numărului de zile de utilizat în formule complexe

În exemplele de mai sus, am arătat cum să calculăm numărul de zile dintr-o lună pentru o dată calendaristică specificată sau automat pentru luna curentă cu ieșirea rezultatului într-o celulă separată. Dar găsirea acestei valori poate fi necesară și pentru calcularea altor indicatori. În acest caz, calculul numărului de zile va fi efectuat într-o formulă complexă și nu va fi afișat într-o celulă separată. Să vedem cum să facem acest lucru cu un exemplu.

Trebuie să afișăm celula numărul de zile rămase până la sfârșitul lunii curente. Ca și în metoda anterioară, această opțiune nu necesită deschidere Vrăjitori de funcții... Puteți introduce doar următoarea expresie într-o celulă:

DAY (E-MONTHS (TODAY (); 0)) - DAY (TODAY ())

După aceea, numărul de zile până la sfârșitul lunii va fi afișat în celula specificată. În fiecare zi, rezultatul va fi actualizat automat, iar de la începutul noii perioade va începe din nou numărătoarea inversă. Se pare că este un fel de temporizator cu numărătoare inversă.

După cum puteți vedea, această formulă constă din două părți. Prima dintre ele este expresia deja familiară pentru calcularea numărului de zile într-o lună:

DAY (E-LUNI (AZI (); 0))

Dar în a doua parte, numărul de astăzi este scăzut din acest indicator:

ZILNIC ())

Astfel, la efectuarea acestui calcul, formula pentru calcularea numărului de zile este parte din formula mai complexă.

Metoda 4: formula alternativă

Dar, din păcate, versiunile programului anterioare Excel 2007 nu au operatorul AL SÂNTURILOR... Ce se întâmplă cu acei utilizatori care folosesc versiuni vechi ale aplicației? Pentru ei, această oportunitate există printr-o altă formulă, care este mai masivă decât cea descrisă mai sus. Să vedem cum să calculăm numărul de zile dintr-o lună pentru o dată calendaristică dată folosind această opțiune.

  1. Selectați celula pentru afișarea rezultatului și accesați fereastra de argumente a operatorului ZIîntr-un mod care deja ne este familiar. Plasați cursorul în singurul câmp al acestei ferestre și faceți clic pe triunghiul inversat din stânga barei de formule. Accesați secțiunea „Alte funcții ...”.
  2. La fereastră Vrăjitori de funcții in grup "Data si ora" evidențiați numele "DATA"și faceți clic pe buton "BINE".
  3. Fereastra operatorului pornește DATA. Această funcție convertește o dată din format obișnuit în valoare numerică, care va trebui apoi procesată de operator ZI.

    Fereastra care se deschide are trei câmpuri. În câmp "Zi" puteți introduce imediat un număr "unu"... Aceasta va fi aceeași acțiune pentru orice situație. Dar celelalte două domenii vor trebui tratate temeinic.

    Plasați cursorul în câmp "An"... Apoi, trecem la alegerea operatorilor prin triunghiul familiar.

  4. Toți din aceeași categorie Vrăjitori de funcții evidențiați numele "AN"și faceți clic pe buton "BINE".
  5. Fereastra de argumente a operatorului pornește AN... Determină anul până la data specificată. Într-o singură fereastră „Data în format numeric” specificăm un link către celulă care conține data inițială pentru care doriți să determinați numărul de zile. După aceea, nu vă grăbiți să faceți clic pe buton "BINE", și faceți clic pe nume "DATA" pe bara de formule.
  6. Apoi ne întoarcem din nou la fereastra de argumente. DATA... Plasați cursorul în câmp "Lună"și treceți la alegerea funcțiilor.
  7. ÎN Expertul de funcții faceți clic pe nume "LUNĂ"și faceți clic pe buton "BINE".
  8. Fereastra de argumente a funcției pornește LUNĂ... Sarcinile sale sunt similare cu operatorul anterior, doar că afișează valoarea numărului lunii. În singurul câmp al acestei ferestre, setați aceeași referință la numărul original. Apoi, în bara de formule, faceți clic pe nume "ZI".
  9. Revenind la fereastra de argumente ZI... Aici trebuie să facem o singură lovitură mică. În singurul câmp al ferestrei, care conține deja date, adăugați expresia la sfârșitul formulei "-unu" fără ghilimele și, de asemenea, pune „+1” după operator LUNĂ... După aceea, faceți clic pe buton "BINE".
  10. După cum puteți vedea, celula preselectată afișează numărul de zile din luna căreia îi aparține numărul specificat. Formula generală arată astfel:

    ZI (DATA (ANUL (D3); LUNA (D3) +1; 1) -1)

Secretul acestei formule este simplu. O folosim pentru a determina data primei zile a perioadei următoare și apoi scădem o zi din aceasta, obținând numărul de zile din luna specificată. Variabila din această formulă este referința celulei D3în două locuri. Dacă o înlocuiți cu adresa celulei în care se află data în cazul dvs. particular, atunci puteți pur și simplu introduce această expresie în orice element al foii fără ajutor Vrăjitori de funcții.

După cum puteți vedea, există mai multe opțiuni pentru a afla numărul de zile dintr-o lună în Excel. Pe care să îl utilizați depinde de scopul final al utilizatorului, precum și de ce versiune a programului utilizează.

Calculatorul de date este conceput pentru a calcula numărul de zile dintre date și pentru a găsi o dată prin adăugarea sau scăderea unui anumit număr de zile dintr-o dată cunoscută.

Adăugați zile până în prezent

Pentru a afla ce dată va fi într-un anumit număr de zile, utilizați această opțiune. Introduceți data de începere și numărul de zile pe care să le adăugați. Folosiți o valoare minus pentru a scădea. De asemenea, calculatorul are opțiunea de a adăuga numai zile lucrătoare.

Calculul numărului de zile între date

Această metodă de calcul va răspunde la întrebarea „câte zile au trecut de la data respectivă”. Introduceți data de începere și data de încheiere și faceți clic pe butonul „calculați”. Calculatorul va arăta câte zile sunt între datele introduse. Separat, calculatorul va arăta numărul de zile lucrătoare.

Cu această opțiune, puteți calcula câte zile rămân până la un anumit eveniment, cum ar fi o zi de naștere sau o vacanță. Pentru a face acest lucru, introduceți data de astăzi în câmpul pentru data de începere și data evenimentului în câmpul pentru data de încheiere.

Sărbători

Calculatorul poate calcula, adăuga și scădea atât zilele calendaristice, cât și zilele lucrătoare. Oficial nelucrător sărbători sunt:

  • 1,2,3,4,5,6,8 ianuarie - sărbători de Anul Nou
  • 7 ianuarie - Crăciun ortodox
  • 23 februarie - Ziua Apărătorului Patriei
  • 8 martie - Ziua Internațională a Femeii
  • 1 mai - Primăvara și Ziua Muncii
  • 9 mai - Ziua Victoriei
  • 12 iunie - Ziua Rusiei
  • 4 noiembrie - Ziua Unității Naționale

Dacă o sărbătoare cade într-o sâmbătă sau duminică, aceasta este amânată pentru următoarea zi lucrătoare. Dar, uneori, weekendul este transferat într-un loc complet diferit din calendar. De exemplu, sâmbăta și duminica, care au căzut în sărbătorile de Anul Nou, pot fi mutate în luna mai pentru a prelungi sărbătorile din luna mai.

La calcularea zilelor, calculatorul ia în considerare atât sărbătorile oficiale, cât și toate transferurile.

Notă: această postare este o traducere a articolului cmcenroe.me/2014/12/05/days-in-month-formula.html ( Partea I), precum și adăugirea autorului la acesta ( Partea a II-a). Nu trebuie să luați materialul în serios, ci mai degrabă ca o încălzire a minții, care nu necesită altceva decât cunoștințe școlare de aritmetică și care nu are nicio aplicație practică. Lectură fericită, tuturor!

Partea I

Introducere

Recent, după o altă noapte nedormită, mă gândeam la metode de memorare a numărului de zile din fiecare lună a anului. Pentru aceasta există o mașină de numărat, precum și o modalitate de a conta pe articulații, dar nici unul, nici celălalt nu mi s-au potrivit. M-am întrebat dacă există un fel de formulă matematică pentru rezolvarea unei astfel de probleme și - nemaiavând una cu un studiu superficial - m-am provocat să o creez.

Formalizarea Cu alte cuvinte, este necesar să se găsească funcția f astfel încât valoarea f (x) pentru fiecare lună X, reprezentat printr-un număr între 1 și 12, este egal cu numărul de zile din luna respectivă. Tabel cu valori ale argumentului și funcției:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x) 31 28 31 30 31 30 31 31 30 31 30 31

Dacă doriți să încercați singur înainte de a citi soluția mea, atunci este momentul. Dacă preferați să vedeți imediat un răspuns gata, atunci uitați-vă sub spoiler.

Răspuns


Mai jos sunt pașii mei pentru a găsi o soluție.

Aparat matematic

În primul rând, să ne reîmprospătăm pe scurt memoria a doi operatori vitali în rezolvarea acestei probleme: diviziunea întregi și restul diviziunii.

Diviziunea întregi este un operator utilizat în multe limbaje de programare atunci când se împarte două numere întregi și aruncă partea fracțională din coeficient. Îl voi înfățișa ca. De exemplu:

Restul diviziei este un operator care găsește restul unei diviziuni. Multe limbaje de programare folosesc simbolul % , dar voi folosi construcții ale formei, de exemplu:

Rețineți că restul diviziunii are aceeași prioritate ca diviziunea.

Cele elementare

Deci, să aplicăm aparatul nostru matematic pentru a obține formula de bază. Într-o lună obișnuită, există 30 sau 31 de zile, deci putem folosi 1 sau 0 pentru a obține alternativ și apoi adăugăm o constantă la acest număr:

Obținem tabelul, valorile corecte sunt evidențiate cu aldine:
X 1 2 3 4 5 6 7 8 9 10 11 12
f (x) 31 30 31 30 31 30 31 30 31 30 31 30

Frumos început! Există deja valori corecte pentru ianuarie și pentru lunile martie-iulie inclusiv. Februarie este un caz special și ne vom ocupa de el puțin mai târziu. După luna iulie, pentru lunile rămase, ordinea de a obține 0 și 1 trebuie inversată.
Pentru a face acest lucru, putem adăuga 1 la dividend:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x) 30 31 30 31 30 31 30 31 30 31 30 31

Acum valorile corecte sunt din august până în decembrie, dar așa cum era de așteptat, valorile pentru celelalte luni sunt incorecte. Să vedem cum putem combina aceste formule.

Suprapunerea măștii

Acest lucru necesită o funcție definită în bucăți, dar - deoarece mi s-a părut plictisitor - m-am gândit la o altă soluție, folosind o parte a funcției într-un interval, cealaltă în altul.
Cred că este cel mai ușor să găsești o expresie care să fie egală cu 1 într-o aplicație și 0 în rest. Metoda prin care, înmulțind un argument cu o expresie, îl excludem din formula din afara sferei de aplicare a acestuia, am numit „mascare”, deoarece acest comportament este similar cu un fel de mască de biți.
Pentru a utiliza această metodă în ultima parte a funcției noastre, trebuie să găsiți o expresie egală cu 1 pentru și - din moment ce valorile argumentelor sunt întotdeauna mai mici de 16 - împărțirea numărului întreg la 8 este în regulă.
X 1 2 3 4 5 6 7 8 9 10 11 12
X ⁄ 8 ⌋ 0 0 0 0 0 0 0 1 1 1 1 1

Acum, folosind această mască, folosind expresia în loc de 1 în dividend, putem înlocui ordinea obținerii 0 și 1 a formulei cu opusul:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x) 31 30 31 30 31 30 31 31 30 31 30 31

Eureka! Totul este corect, cu excepția lunii februarie. Surpriza surpriza.

februarie

Orice lună are 30 sau 31 de zile, cu excepția lunii februarie cu 28 (anul bisect este în afara domeniului acestei probleme). În prezent, conform formulei noastre, are 30 de zile, deci ar fi bine să scădem expresia egală cu 2 la.
Cel mai bun lucru cu care am venit este acest lucru, care se maschează toate lunile după februarie:
X 1 2 3 4 5 6 7 8 9 10 11 12
2 mod X 0 0 2 2 2 2 2 2 2 2 2 2

Schimbând constanta de bază la 28, adăugând 2 la restul lunilor, obținem formula:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x) 29 28 31 30 31 30 31 31 30 31 30 31

Din păcate, ianuarie este acum cu 2 zile mai scurt. Din fericire, este ușor să obțineți o expresie care se aplică numai în prima lună: este inversul numărului rotunjit în jos. Înmulțind-o cu 2 obținem formula finală:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x) 31 28 31 30 31 30 31 31 30 31 30 31

Postfaţă

Iată - o formulă pentru obținerea numărului de zile în orice lună a anului, folosind cea mai simplă aritmetică. Data viitoare când vă amintiți câte zile sunt în septembrie, pur și simplu faceți acest lucru cu această funcție JavaScript cu o singură linie:

Funcția f (x) (returnează 28 + (x + Math.floor (x / 8))% 2 + 2% x + 2 * Math.floor (1 / x);)

Partea a II-a

Introducere

În prima parte, a fost obținută o formulă scurtă și chiar ușor elegantă, ale cărei avantaje principale sunt simplitatea aparatului matematic, absența ramurilor și a expresiilor condiționate și laconicismul. Dezavantajele - în afară de faptul că nu îl veți folosi în proiect - includ lipsa de validare pentru viscoconut și anii non-bisectivi.
Prin urmare, mi-am pus sarcina de a crea o funcție f astfel încât valoarea f (x, y) pentru fiecare lună X reprezentat de un număr de la 1 la 12 și un an y mai mare de 0 este egal cu numărul de zile dintr-o lună Xîn anul y.
Pentru cei nerăbdători, există un răspuns gata sub spoiler, în timp ce restul sunt rugați să mă urmărească.

Răspuns

Restul diviziei: modși ⌊⌋

Pentru claritate vizuală, să fim de acord că în unele formule operatorul de diviziune cu rest este înlocuit cu paranteze inferioare, unde mi s-a părut necesar:

An bisect

Într-un an bisect, se introduce o zi calendaristică suplimentară: 29 februarie. După cum știți, un an bisect este un multiplu de 4 și nu un multiplu de 100 sau un multiplu de 400. Să scriem expresia identică cu această afirmație:

Pentru a converti această expresie într-una algebrică, este necesar să se aplice o injecție a formei la rezultatul expresiei:

Ceea ce vă va permite să obțineți 1 când împărțiți fără rest și 0 când împărțiți cu un rest, pentru a-l utiliza în formula pentru determinarea numărului de zile într-o lună.

Ca o funcție g " puteți folosi 1 minus rest pentru:

X 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
g "(x) Infinit 1 0 0 0 0 0 0 0 0 0 0 0 0 0

Este ușor de văzut că, mărind dividendul și divizorul cu 1, obținem formula corectă pentru:
X 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
g "(x) 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Astfel, expresia va fi scrisă ca:


Și scriem expresia ca:

Aplicând această abordare, obținem următoarea funcție g (y), a cărui valoare va fi 1 dacă anul este bisect sau 0 altfel:

y 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000
g (y) 0 0 1 0 0 0 1 0 0 0 1
y 2000 2100 2200 2300 2400 2500 2600 2700 2800 2900 3000
g (y) 1 0 0 0 1 0 0 0 1 0 0

Anii bisecți sunt îndrăzneți.

Vă reamintesc că, în cadrul acordului acceptat, operatorul pentru obținerea restului diviziunii poate fi descris ca fiind modși ⌊⌋.

Suprapunerea măștii

În formulă, partea este un amendament care adaugă 2 zile la ianuarie. Dacă eliminăm factorul 2 și înlocuim 1 cu 2 în numărător, atunci această formulă va adăuga 2 zile la ianuarie și 1 zi la februarie, ceea ce ne oferă cheia adăugării unei zile într-un an bisect. Pentru claritate, folosim valoarea intermediară din formulă g (y) si ca y folosim 2000 (salt) și 2001 (fără salt) ani:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x, 2000) 31 29 31 30 31 30 31 31 30 31 30 31
f (x, 2001) 30 28 31 30 31 30 31 31 30 31 30 30

Valorile pentru toate lunile, cu excepția lunii ianuarie a unui an non-bisect, sunt corecte.

Pentru a corecta această neînțelegere enervantă, adăugați o zi la ianuarie cu formula pe care o cunoaștem deja:


Sau:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x, 2000) 31 29 31 30 31 30 31 31 30 31 30 31
f (x, 2001) 31 28 31 30 31 30 31 31 30 31 30 30

Concluzie

Ca rezultat, se obține o formulă mult mai greoaie, dar mai universală, care poate fi folosită și pentru a obține numărul de zile dintr-o lună a unui anumit an:

Funcția f (x, y) (returnează 28 + ((x + Math.floor (x / 8))% 2) + 2% x + Math.floor ((1 + (1 - (y% 4 + 2)% (y% 4 + 1)) * ((y% 100 + 2)% (y% 100 + 1)) + (1 - (y% 400 + 2)% (y% 400 + 1))) / x) + Math.floor (1 / x) - Math.floor (((1 - (y% 4 + 2)% (y% 4 + 1)) * ((y% 100 + 2)% (y% 100 + 1 )) + (1 - (y% 400 + 2)% (y% 400 + 1))) / x);)
Exemplu în C # ideone.com/fANutz.

1 ... Nu știu cum să folosesc astfel de mnemonice, așa că am spionat semnul de pe Internet.
2 ... „Noțiunile de bază” sau „Regula cu multe excepții”, la fel ca majoritatea regulilor.
3 ... Inițial, februarie a fost ultima lună a anului în calendarul roman, deci există o logică prin aceea că este mai scurtă decât toate celelalte. Există, de asemenea, logică în adăugarea sau eliminarea unei zile la sfârșitul anului, astfel încât lungimea sa este variabilă.

Actualizare. unu:
O traducere alternativă a primei părți în



Ți-a plăcut articolul? Împărtășește-l