Computer finestre Internet

Quanti giorni nel mese di maggio. Determinazione del numero di giorni in un mese in Microsoft Excel. Calcolo del numero di giorni tra le date

Recentemente, dopo tanto tempo passato senza dormire, ho pensato a come puoi scoprire il numero di giorni in un mese, conoscendone il numero. Ci sono filastrocche su questo argomento, c'è un modo per contare con le nocche, ma questi metodi non mi si addicono - mi sono immerso nella ricerca di una formula matematica, che ho derivato dopo un po'.

Quindi il compito

Formalmente In altre parole, dobbiamo ottenere una funzione f (x) che fornisca il seguente elenco di valori (che, tra l'altro, ho trovato da qualche parte su Internet e non ho dedotto usando regole mnemoniche):

Va notato che come argomento riceviamo solo il numero del mese, ad es. non contiamo gli anni bisestili e f (2) = 28.

Se vuoi conoscere il risultato che ho ottenuto, scorri fino in fondo a questa pagina. Quella che verrà descritta di seguito è la derivazione della formula desiderata.

Cosa useremo

Oltre all'addizione, alla sottrazione e alla moltiplicazione, utilizzerò due operazioni: divisione intera e resto. Ti ricordo di cosa si tratta:

  • Divisione intera, o "divisione e arrotondamento per difetto". Lo rappresenterò come una normale divisione: a / b - che significa ⌊a / b⌋. Ad esempio, 5/3 = 1.
  • Prendendo il resto modulo... Indicherò la divisione tradizionale con un resto: a% b = a - (a / b) * b. Ad esempio, 5% 3 = 2.

Hanno la stessa priorità e sono associativi di sinistra.

Fondamenti o regola con molte eccezioni

Proviamo a trovare un tale modello che soddisfi il maggior numero possibile di valori dell'argomento. Di solito, il numero di giorni in un mese oscilla tra 30 e 31. Allo stesso tempo, puoi notare la dipendenza di questo numero dalla parità del mese, quindi useremo l'operazione di prendere il resto modulo 2. sembra che dovrebbe essere qualcosa del tipo:

f₁ (x) = 30 + x% 2


Buon inizio! Indipendentemente da febbraio, che ovviamente dovrà fare i conti con alcuni trucchi, siamo contenti di essere stati in grado di adattare la funzione per la prima metà dell'anno. E poi, a partire da agosto, la parità deve essere cambiata al contrario. Questo può essere fatto sostituendo x% 2 nella prima versione della formula su (x + 1)% 2:

f₂ (x) = 30 + (x + 1)% 2


Come previsto, ora la prima metà dell'anno è già fuori dal range dei valori corretti, ma i mesi da agosto a dicembre hanno dato quello che ci serviva. Troviamo un modo per combinare queste due parti.

Maschera

Abbiamo bisogno di +1 nel dividendo per essere "attivato" solo quando l'argomento raggiunge valori maggiori di 8, ad es. dobbiamo applicare una maschera. In questo caso, i valori dell'argomento non possono superare 12. Quindi, la divisione intera dell'argomento per 8 è l'ideale per noi:


Esattamente come ne abbiamo bisogno. Usiamo questa conclusione:

f₃ (x) = 30 + (x + x / 8)% 2


Oh! Tutto è corretto, tranne febbraio. Che inaspettato.

febbraio

Tutti i mesi hanno 30 o 31 giorni, in febbraio - 28 (ricorda, non consideriamo gli anni bisestili).

Riferimento storico: Nel calendario romano, febbraio era l'ultimo mese dell'anno - devi ammettere che aggiungere un giorno negli anni bisestili alla fine del calendario è più intuitivo. Tuttavia, usiamo il calendario gregoriano, in cui il mese più corto viene spostato più vicino all'inizio per volontà di uno dei saggi governanti.

Nel più ultima versione la nostra formula ha ottenuto 30 giorni a febbraio. Pertanto, dobbiamo tagliare un paio di giorni da lui. Naturalmente, alcuni mesi in più ne soffriranno: o a sinistra di febbraio, o a destra di esso nella nostra lista - tuttavia, ci sono molti meno mesi a destra, quindi dovremo sacrificare gennaio, quindi aggiustando la formula per questo. Puoi tagliare i giorni per il primo e il secondo mese usando l'espressione 2% x.

Nota: questo post è una traduzione dell'articolo cmcenroe.me/2014/12/05/days-in-month-formula.html ( parte prima), così come l'aggiunta dell'autore ( Seconda parte). Non dovresti prendere sul serio il materiale, ma piuttosto come un riscaldamento per la mente, che non richiede altro che una conoscenza scolastica dell'aritmetica e non ha un'applicazione pratica. Buona lettura a tutti!

parte prima

introduzione

Recentemente, dopo un'altra notte insonne, stavo pensando a metodi per ricordare il numero di giorni in ogni mese dell'anno. Per questo c'è una macchina per contare, oltre a un modo per contare sulle nocche, ma né l'una né l'altra mi andavano bene. Mi chiedevo se esistesse una sorta di formula matematica per risolvere un problema del genere e, non trovandone una con uno studio frettoloso, mi sfidai a crearla.

Formalizzare In altre parole, è necessario trovare la funzione F tale che il valore f(x) per ogni mese X, rappresentato da un numero compreso tra 1 e 12, è uguale al numero di giorni di quel mese. Tabella dei valori di argomenti e funzioni:

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

Se hai il desiderio di provarlo tu stesso prima di leggere la mia soluzione, allora ora è il momento. Se preferisci vedere immediatamente una risposta già pronta, guarda sotto lo spoiler.

Risposta


Di seguito sono riportati i miei passaggi per trovare una soluzione.

Apparato matematico

Per prima cosa, rinfreschiamoci velocemente la memoria su due operatori fondamentali per risolvere questo problema: divisione intera e resto della divisione.

Divisione interaè un operatore utilizzato in molti linguaggi di programmazione quando si divide due interi e scarta la parte frazionaria dal quoziente. Lo ritrarrò come. Per esempio:

Resto della divisioneè un operatore che trova il resto di una divisione. Molti linguaggi di programmazione usano il simbolo % , ma userò costruzioni della forma, ad esempio:

Nota che il resto della divisione ha la stessa priorità della divisione.

Le basi

Quindi, applichiamo il nostro apparato matematico per ottenere la formula di base. In un mese tipico, ci sono 30 o 31 giorni, quindi possiamo usare 1 o 0 per ottenere alternativamente, e quindi aggiungere una costante a questo numero:

Otteniamo la tabella, i valori corretti sono evidenziati in grassetto:
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

Buon inizio! Esistono già valori corretti per gennaio e per i mesi da marzo a luglio inclusi. Febbraio è un caso speciale, di cui ci occuperemo un po' più tardi. Dopo luglio, per i restanti mesi, l'ordine di ottenimento di 0 e 1 deve essere invertito.
Per fare ciò, possiamo aggiungere 1 al dividendo:

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

Ora i valori corretti vanno da agosto a dicembre, ma come previsto, i valori per gli altri mesi non sono corretti. Vediamo come combinare queste formule.

Sovrapposizione maschera

Ciò richiede una funzione definita a tratti, ma - poiché mi sembrava noioso - ho pensato a un'altra soluzione, utilizzando una parte della funzione su un intervallo, l'altra su un altro.
Penso che sia più facile trovare un'espressione uguale a 1 in un'applicazione e 0 nel resto. Il metodo in cui, moltiplicando un argomento per un'espressione, lo escludiamo dalla formula al di fuori dell'ambito della sua applicazione, l'ho chiamato "mascheramento", perché questo comportamento è simile a una sorta di maschera di bit.
Per applicare questo metodo nell'ultima parte della nostra funzione, devi trovare un'espressione uguale a 1 per e - poiché i valori degli argomenti sono sempre inferiori a 16 - la divisione intera per 8 va bene per questo.
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

Ora, usando questa maschera, usando l'espressione invece di 1 nel dividendo, possiamo sostituire l'ordine di ottenere 0 e 1 della formula con l'opposto:

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! Tutto è corretto, tranne febbraio. Sorpresa sorpresa.

febbraio

Ogni mese ha 30 o 31 giorni, ad eccezione di febbraio con il suo 28 (l'anno bisestile non rientra nell'ambito di questo problema). Al momento, secondo la nostra formula, ha 30 giorni, quindi sarebbe bello sottrarre l'espressione pari a 2 at.
Il meglio che ho potuto inventare è questo, che mette una maschera su tutti i mesi dopo febbraio:
X 1 2 3 4 5 6 7 8 9 10 11 12
2 modi X 0 0 2 2 2 2 2 2 2 2 2 2

Cambiando la costante di base a 28, aggiungendo 2 al resto dei mesi, otteniamo la 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

Sfortunatamente, gennaio è ora più corto di 2 giorni. Fortunatamente, è facile ottenere un'espressione che si applica solo al primo mese: è l'inverso del numero arrotondato per difetto. Moltiplicandolo per 2 otteniamo la formula finale:

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

Epilogo

Eccola: una formula per ottenere il numero di giorni in qualsiasi mese dell'anno, utilizzando l'aritmetica più semplice. La prossima volta che pensi a quanti giorni ci sono a settembre, fallo semplicemente con questa funzione JavaScript di una riga:

Funzione f (x) (ritorno 28 + (x + Math.floor (x / 8))% 2 + 2% x + 2 * Math.floor (1 / x);)

Seconda parte

introduzione

Nella prima parte è stata ottenuta una formula breve e anche leggermente elegante, i cui principali vantaggi sono la semplicità dell'apparato matematico, l'assenza di rami ed espressioni condizionali e il laconicismo. Gli svantaggi - a parte il fatto che non lo utilizzerai nel tuo progetto - includono la mancanza di verifica per gli anni viscosi e non bisestili.
Pertanto, mi sono posto il compito di creare una funzione F tale che il valore f (x, y) per ogni mese X rappresentato da un numero da 1 a 12 e un anno maggiore di 0 è uguale al numero di giorni in un mese X nell'anno .
Per gli impazienti, c'è una risposta già pronta sotto lo spoiler, mentre agli altri viene chiesto di seguirmi.

Risposta

Resto della divisione: modalità e ⌊⌋

Per chiarezza visiva, concordiamo che in alcune formule l'operatore di divisione con resto è sostituito da parentesi inferiori, dove mi è sembrato necessario:

Anno bisestile

In un anno bisestile viene introdotto un giorno di calendario aggiuntivo: 29 febbraio. Come sai, un anno bisestile è un multiplo di 4 e non un multiplo di 100, o un multiplo di 400. Scriviamo l'espressione identica a questa affermazione:

Per convertire questa espressione in una algebrica, è necessario applicare un'iniezione della forma al risultato dell'espressione:

Che ti permetterà di ottenere 1 quando dividi senza resto e 0 quando dividi con resto, per usarlo nella formula per determinare il numero di giorni in un mese.

Come una funzione G " puoi usare 1 meno resto per:

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

È facile vedere che aumentando il dividendo e il divisore di 1, otteniamo la formula corretta per:
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

Pertanto, l'espressione sarà scritta come:


E scriviamo l'espressione come:

Applicando questo approccio, otteniamo la seguente funzione g (y), il cui valore sarà 1 se l'anno è bisestile, o 0 in caso contrario:

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

Gli anni bisestili sono in grassetto.

Vi ricordo che nell'ambito dell'accordo accettato, l'operatore per ottenere il resto della divisione può essere raffigurato come modalità e ⌊⌋.

Sovrapposizione maschera

Nella formula, la parte è un emendamento che aggiunge 2 giorni a gennaio. Se rimuoviamo il fattore 2 e sostituiamo 1 con 2 al numeratore, questa formula aggiungerà 2 giorni a gennaio e 1 giorno a febbraio, il che ci fornisce la chiave per aggiungere un giorno in un anno bisestile. Per chiarezza, usiamo il valore intermedio nella formula g (y) e come usiamo gli anni 2000 (bisestili) e 2001 (non bisestili):

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

I valori per tutti i mesi tranne gennaio di un anno non bisestile sono corretti.

Per correggere questo fastidioso malinteso, aggiungi 1 giorno a gennaio con la formula che già conosciamo:


O:

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

Conclusione

Di conseguenza si ottiene una formula molto più macchinosa, ma più universale, che può essere utilizzata anche per ottenere il numero di giorni in un mese di un certo anno:

Funzione f (x, y) (ritorno 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);)
Esempio in C# ideone.com/fANutz.

1 ... Non so come usare tali mnemonici, quindi ho spiato il segno su Internet.
2 ... "Le basi" o "Regola con molte eccezioni", come la maggior parte delle regole.
3 ... Inizialmente, febbraio era l'ultimo mese dell'anno nel calendario romano, quindi c'è una logica nel fatto che sia più corto di tutti gli altri. C'è anche una logica nell'aggiungere o rimuovere un giorno alla fine dell'anno, quindi la sua lunghezza è variabile.

Aggiorna 1:
Una traduzione alternativa della prima parte in

Per risolvere alcuni problemi durante la creazione di una tabella, è necessario specificare il numero di giorni in un mese in una cella separata o all'interno di una formula in modo che il programma possa eseguire i calcoli necessari. Excel dispone di strumenti per eseguire questa operazione. consideriamo diversi modi applicazione di questa opportunità.

Puoi calcolare il numero di giorni in un mese in Excel utilizzando operatori di categoria speciali "Data e ora"... Per scoprire quale opzione è meglio applicare, devi prima stabilire gli obiettivi dell'operazione. A seconda di ciò, il risultato del calcolo può essere visualizzato in un elemento separato sul foglio oppure può essere utilizzato all'interno di un'altra formula.

Metodo 1: combinazione degli operatori GIORNO e MESE

Maggior parte in modo semplice per risolvere questo problema è una combinazione di operatori GIORNO e DEGLI EONTI.

Funzione GIORNO appartiene al gruppo degli operatori "Data e ora"... Indica un numero specifico da 1 prima 31 ... Nel nostro caso, il compito di questo operatore sarà quello di indicare ultimo giorno mesi usando la funzione incorporata come argomento DEGLI EONTI.

Sintassi dell'operatore GIORNO prossimo:

GIORNO (date_num_format)

Cioè, l'unico argomento per questa funzione è "Data in formato numerico"... Sarà impostato dall'operatore DEGLI EONTI... Va detto che la data in formato numerico è diversa dal solito formato. Ad esempio, data 04.05.2017 numericamente sembrerà 42859 ... Pertanto, Excel utilizza questo formato solo per operazioni interne. È usato raramente per la visualizzazione nelle celle.

Operatore DEGLI EONTI ha lo scopo di indicare il numero ordinale dell'ultimo giorno del mese, che è un numero specificato di mesi avanti o indietro dalla data specificata. La sintassi della funzione è la seguente:

EON MESI (data_inizio, num_mesi)

Operatore "Data d'inizio" contiene la data a partire dalla quale viene effettuato il conto alla rovescia o un riferimento alla cella in cui si trova.

Operatore "Numero di mesi" indica il numero di mesi da contare a partire da una determinata data.

Ora vediamo come funziona con un esempio specifico. Per fare ciò, prendiamo un foglio Excel, in una delle celle di cui è iscritto un certo numero di calendario. E' necessario, utilizzando il suddetto insieme di operatori, determinare quanti giorni ci sono nel periodo mensile a cui si riferisce questo numero.


La nostra formula generale ha assunto la seguente forma:

GIORNO (ETONI (B3,0))

In questa formula, il valore della variabile è solo l'indirizzo della cella ( B3). Pertanto, se non si desidera eseguire la procedura con Procedure guidate delle funzioni, puoi inserire questa formula in qualsiasi elemento del foglio semplicemente sostituendo l'indirizzo della cella contenente il numero con quello rilevante nel tuo caso specifico. Il risultato sarà simile.

Metodo 2: determinazione automatica del numero di giorni

Ora diamo un'occhiata a un altro problema. È necessario che il numero di giorni venga visualizzato non in base a una data data di calendario, ma in base a quella corrente. Inoltre, la modifica dei periodi verrebbe effettuata automaticamente senza l'intervento dell'utente. Può sembrare strano, ma questo compito è più facile del precedente. Per risolverlo, anche aperto Procedura guidata non necessario perché la formula che esegue questa operazione non contiene valori variabili o riferimenti di cella. Puoi semplicemente guidare la seguente formula nella cella del foglio in cui desideri che il risultato venga visualizzato senza modifiche:

GIORNO (E-MESI (OGGI (); 0))

La funzione OGGI incorporata che abbiamo usato in questo caso mostra il numero di oggi e non ha argomenti. Pertanto, la tua cella visualizzerà costantemente il numero di giorni del mese corrente.

Metodo 3: calcolo del numero di giorni da utilizzare in formule complesse

Negli esempi sopra, abbiamo mostrato come calcolare il numero di giorni in un mese per una data di calendario specificata o automaticamente per il mese corrente con l'output del risultato in una cella separata. Ma trovare questo valore potrebbe essere necessario anche per calcolare altri indicatori. In questo caso, il calcolo del numero di giorni verrà eseguito all'interno di una formula complessa e non verrà visualizzato in una cella separata. Vediamo come farlo con un esempio.

Dobbiamo fare in modo che la cella mostri il numero di giorni rimasti fino alla fine del mese corrente. Come nel metodo precedente, questa opzione non richiede l'apertura Procedure guidate delle funzioni... Puoi semplicemente digitare la seguente espressione in una cella:

GIORNO (E-MESI (OGGI (); 0)) - GIORNO (OGGI ())

Successivamente, il numero di giorni fino alla fine del mese verrà visualizzato nella cella specificata. Ogni giorno il risultato verrà aggiornato automaticamente e dall'inizio del nuovo periodo ricomincerà il conto alla rovescia. Si scopre una specie di conto alla rovescia.

Come puoi vedere, questa formula è composta da due parti. Il primo di questi è l'espressione già familiare per calcolare il numero di giorni in un mese:

GIORNO (E-MESI (OGGI (); 0))

Ma nella seconda parte, il numero di oggi viene sottratto da questo indicatore:

GIORNO PER GIORNO ())

Pertanto, quando si esegue questo calcolo, la formula per calcolare il numero di giorni fa parte di una formula più complessa.

Metodo 4: formula alternativa

Ma, sfortunatamente, le versioni del programma precedenti a Excel 2007 non hanno l'operatore DEGLI EONTI... Che dire di quegli utenti che utilizzano vecchie versioni dell'applicazione? Per loro questa opportunità esiste attraverso un'altra formula, più massiccia di quella sopra descritta. Vediamo come calcolare il numero di giorni in un mese per una determinata data di calendario utilizzando questa opzione.

  1. Seleziona la cella per visualizzare il risultato e vai alla finestra degli argomenti dell'operatore GIORNO in un modo che ci è già familiare. Posiziona il cursore nell'unico campo di questa finestra e fai clic sul triangolo invertito a sinistra della barra della formula. Vai alla sezione "Altre funzioni...".
  2. Nella finestra Procedure guidate delle funzioni in un gruppo "Data e ora" evidenziare il nome "DATA" e clicca sul pulsante "OK".
  3. Si avvia la finestra dell'operatore DATA. Questa funzione converte una data dal formato consueto in un valore numerico, che l'operatore dovrà poi elaborare GIORNO.

    La finestra che si apre ha tre campi. In campo "Giorno" puoi inserire subito un numero "1"... Questa sarà la stessa azione per qualsiasi situazione. Ma gli altri due campi dovranno essere trattati a fondo.

    Posiziona il cursore nel campo "Anno"... Successivamente, passiamo alla scelta degli operatori attraverso il triangolo familiare.

  4. Tutti nella stessa categoria Procedure guidate delle funzioni evidenziare il nome "ANNO" e clicca sul pulsante "OK".
  5. Viene avviata la finestra degli argomenti dell'operatore ANNO... Determina l'anno entro la data specificata. In una finestra singola "Data in formato numerico" specifichiamo un collegamento alla cella contenente la data originale per la quale si desidera determinare il numero di giorni. Dopodiché, non affrettarti a fare clic sul pulsante "OK" e clicca sul nome "DATA" sulla barra della formula.
  6. Quindi torniamo di nuovo alla finestra degli argomenti. DATA... Posiziona il cursore nel campo "Mese" e passare alla scelta delle funzioni.
  7. V Procedura guidata clicca sul nome "MESE" e clicca sul pulsante "OK".
  8. Viene avviata la finestra degli argomenti della funzione MESE... I suoi compiti sono simili all'operatore precedente, solo che visualizza il valore del numero del mese. Nell'unico campo di questa finestra, imposta lo stesso riferimento al numero originale. Quindi, nella barra della formula, fai clic sul nome "GIORNO".
  9. Tornando alla finestra degli argomenti GIORNO... Qui dobbiamo fare solo un piccolo tratto. Nell'unico campo della finestra, che contiene già dati, aggiungi l'espressione alla fine della formula "-1" senza virgolette e metti anche "+1" dopo l'operatore MESE... Successivamente, fai clic sul pulsante "OK".
  10. Come puoi vedere, la cella preselezionata mostra il numero di giorni del mese a cui appartiene il numero specificato. La formula generale si presenta così:

    GIORNO (DATA (ANNO (G3); MESE (G3) +1; 1) -1)

Il segreto di questa formula è semplice. Lo usiamo per determinare la data del primo giorno del periodo successivo, quindi sottraiamo un giorno da esso, ottenendo il numero di giorni nel mese specificato. La variabile in questa formula è il riferimento di cella RE3 in due posti. Se lo sostituisci con l'indirizzo della cella in cui si trova la data nel tuo caso particolare, puoi semplicemente guidare questa espressione in qualsiasi elemento del foglio senza aiuto Procedure guidate delle funzioni.

Come puoi vedere, ci sono diverse opzioni per scoprire il numero di giorni in un mese in Excel. Quale utilizzare dipende dall'obiettivo finale dell'utente e dalla versione del programma che utilizza.

Nota: questo post è una traduzione dell'articolo cmcenroe.me/2014/12/05/days-in-month-formula.html ( parte prima), così come l'aggiunta dell'autore ( Seconda parte). Non dovresti prendere sul serio il materiale, ma piuttosto come un riscaldamento per la mente, che non richiede altro che una conoscenza scolastica dell'aritmetica e non ha un'applicazione pratica. Buona lettura a tutti!

parte prima

introduzione

Recentemente, dopo un'altra notte insonne, stavo pensando a metodi per ricordare il numero di giorni in ogni mese dell'anno. Per questo c'è una macchina per contare, oltre a un modo per contare sulle nocche, ma né l'una né l'altra mi andavano bene. Mi chiedevo se esistesse una sorta di formula matematica per risolvere un problema del genere e, non trovandone una con uno studio frettoloso, mi sfidai a crearla.

Formalizzare In altre parole, è necessario trovare la funzione F tale che il valore f(x) per ogni mese X, rappresentato da un numero compreso tra 1 e 12, è uguale al numero di giorni di quel mese. Tabella dei valori di argomenti e funzioni:

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

Se hai il desiderio di provarlo tu stesso prima di leggere la mia soluzione, allora ora è il momento. Se preferisci vedere immediatamente una risposta già pronta, guarda sotto lo spoiler.

Risposta


Di seguito sono riportati i miei passaggi per trovare una soluzione.

Apparato matematico

Per prima cosa, rinfreschiamoci velocemente la memoria su due operatori fondamentali per risolvere questo problema: divisione intera e resto della divisione.

Divisione interaè un operatore utilizzato in molti linguaggi di programmazione quando si divide due interi e scarta la parte frazionaria dal quoziente. Lo ritrarrò come. Per esempio:

Resto della divisioneè un operatore che trova il resto di una divisione. Molti linguaggi di programmazione usano il simbolo % , ma userò costruzioni della forma, ad esempio:

Nota che il resto della divisione ha la stessa priorità della divisione.

Le basi

Quindi, applichiamo il nostro apparato matematico per ottenere la formula di base. In un mese tipico, ci sono 30 o 31 giorni, quindi possiamo usare 1 o 0 per ottenere alternativamente, e quindi aggiungere una costante a questo numero:

Otteniamo la tabella, i valori corretti sono evidenziati in grassetto:
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

Buon inizio! Esistono già valori corretti per gennaio e per i mesi da marzo a luglio inclusi. Febbraio è un caso speciale, di cui ci occuperemo un po' più tardi. Dopo luglio, per i restanti mesi, l'ordine di ottenimento di 0 e 1 deve essere invertito.
Per fare ciò, possiamo aggiungere 1 al dividendo:

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

Ora i valori corretti vanno da agosto a dicembre, ma come previsto, i valori per gli altri mesi non sono corretti. Vediamo come combinare queste formule.

Sovrapposizione maschera

Ciò richiede una funzione definita a tratti, ma - poiché mi sembrava noioso - ho pensato a un'altra soluzione, utilizzando una parte della funzione su un intervallo, l'altra su un altro.
Penso che sia più facile trovare un'espressione uguale a 1 in un'applicazione e 0 nel resto. Il metodo in cui, moltiplicando un argomento per un'espressione, lo escludiamo dalla formula al di fuori dell'ambito della sua applicazione, l'ho chiamato "mascheramento", perché questo comportamento è simile a una sorta di maschera di bit.
Per applicare questo metodo nell'ultima parte della nostra funzione, devi trovare un'espressione uguale a 1 per e - poiché i valori degli argomenti sono sempre inferiori a 16 - la divisione intera per 8 va bene per questo.
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

Ora, usando questa maschera, usando l'espressione invece di 1 nel dividendo, possiamo sostituire l'ordine di ottenere 0 e 1 della formula con l'opposto:

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! Tutto è corretto, tranne febbraio. Sorpresa sorpresa.

febbraio

Ogni mese ha 30 o 31 giorni, ad eccezione di febbraio con il suo 28 (l'anno bisestile non rientra nell'ambito di questo problema). Al momento, secondo la nostra formula, ha 30 giorni, quindi sarebbe bello sottrarre l'espressione pari a 2 at.
Il meglio che ho potuto inventare è questo, che mette una maschera su tutti i mesi dopo febbraio:
X 1 2 3 4 5 6 7 8 9 10 11 12
2 modi X 0 0 2 2 2 2 2 2 2 2 2 2

Cambiando la costante di base a 28, aggiungendo 2 al resto dei mesi, otteniamo la 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

Sfortunatamente, gennaio è ora più corto di 2 giorni. Fortunatamente, è facile ottenere un'espressione che si applica solo al primo mese: è l'inverso del numero arrotondato per difetto. Moltiplicandolo per 2 otteniamo la formula finale:

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

Epilogo

Eccola: una formula per ottenere il numero di giorni in qualsiasi mese dell'anno, utilizzando l'aritmetica più semplice. La prossima volta che pensi a quanti giorni ci sono a settembre, fallo semplicemente con questa funzione JavaScript di una riga:

Funzione f (x) (ritorno 28 + (x + Math.floor (x / 8))% 2 + 2% x + 2 * Math.floor (1 / x);)

Seconda parte

introduzione

Nella prima parte è stata ottenuta una formula breve e anche leggermente elegante, i cui principali vantaggi sono la semplicità dell'apparato matematico, l'assenza di rami ed espressioni condizionali e il laconicismo. Gli svantaggi - a parte il fatto che non lo utilizzerai nel tuo progetto - includono la mancanza di verifica per gli anni viscosi e non bisestili.
Pertanto, mi sono posto il compito di creare una funzione F tale che il valore f (x, y) per ogni mese X rappresentato da un numero da 1 a 12 e un anno maggiore di 0 è uguale al numero di giorni in un mese X nell'anno .
Per gli impazienti, c'è una risposta già pronta sotto lo spoiler, mentre agli altri viene chiesto di seguirmi.

Risposta

Resto della divisione: modalità e ⌊⌋

Per chiarezza visiva, concordiamo che in alcune formule l'operatore di divisione con resto è sostituito da parentesi inferiori, dove mi è sembrato necessario:

Anno bisestile

In un anno bisestile viene introdotto un giorno di calendario aggiuntivo: 29 febbraio. Come sai, un anno bisestile è un multiplo di 4 e non un multiplo di 100, o un multiplo di 400. Scriviamo l'espressione identica a questa affermazione:

Per convertire questa espressione in una algebrica, è necessario applicare un'iniezione della forma al risultato dell'espressione:

Che ti permetterà di ottenere 1 quando dividi senza resto e 0 quando dividi con resto, per usarlo nella formula per determinare il numero di giorni in un mese.

Come una funzione G " puoi usare 1 meno resto per:

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

È facile vedere che aumentando il dividendo e il divisore di 1, otteniamo la formula corretta per:
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

Pertanto, l'espressione sarà scritta come:


E scriviamo l'espressione come:

Applicando questo approccio, otteniamo la seguente funzione g (y), il cui valore sarà 1 se l'anno è bisestile, o 0 in caso contrario:

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

Gli anni bisestili sono in grassetto.

Vi ricordo che nell'ambito dell'accordo accettato, l'operatore per ottenere il resto della divisione può essere raffigurato come modalità e ⌊⌋.

Sovrapposizione maschera

Nella formula, la parte è un emendamento che aggiunge 2 giorni a gennaio. Se rimuoviamo il fattore 2 e sostituiamo 1 con 2 al numeratore, questa formula aggiungerà 2 giorni a gennaio e 1 giorno a febbraio, il che ci fornisce la chiave per aggiungere un giorno in un anno bisestile. Per chiarezza, usiamo il valore intermedio nella formula g (y) e come usiamo gli anni 2000 (bisestili) e 2001 (non bisestili):

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

I valori per tutti i mesi tranne gennaio di un anno non bisestile sono corretti.

Per correggere questo fastidioso malinteso, aggiungi 1 giorno a gennaio con la formula che già conosciamo:


O:

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

Conclusione

Di conseguenza si ottiene una formula molto più macchinosa, ma più universale, che può essere utilizzata anche per ottenere il numero di giorni in un mese di un certo anno:

Funzione f (x, y) (ritorno 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);)
Esempio in C# ideone.com/fANutz.

1 ... Non so come usare tali mnemonici, quindi ho spiato il segno su Internet.
2 ... "Le basi" o "Regola con molte eccezioni", come la maggior parte delle regole.
3 ... Inizialmente, febbraio era l'ultimo mese dell'anno nel calendario romano, quindi c'è una logica nel fatto che sia più corto di tutti gli altri. C'è anche una logica nell'aggiungere o rimuovere un giorno alla fine dell'anno, quindi la sua lunghezza è variabile.

Aggiorna 1:
Una traduzione alternativa della prima parte in

Il calcolatore di date è progettato per calcolare il numero di giorni tra le date e per trovare una data aggiungendo o sottraendo un numero specifico di giorni da una data nota.

Aggiungi giorni fino ad oggi

Per scoprire quale data sarà tra un certo numero di giorni, usa questa opzione. Inserisci la data di inizio e il numero di giorni da aggiungere. Utilizzare un valore negativo per sottrarre. La calcolatrice ha anche un'opzione per aggiungere solo i giorni lavorativi.

Calcolo del numero di giorni tra le date

Questo metodo di calcolo risponderà alla domanda "quanti giorni sono trascorsi dalla data". Inserisci la data di inizio e di fine e fai clic sul pulsante "calcola". Il calcolatore mostrerà quanti giorni sono tra le date inserite. Separatamente, la calcolatrice mostrerà il numero di giorni lavorativi.

Con questa opzione puoi calcolare quanti giorni mancano a un determinato evento, come un compleanno o una vacanza. Per fare ciò, inserisci la data odierna nel campo della data di inizio e la data dell'evento nel campo della data di fine.

Vacanze

La calcolatrice può calcolare, aggiungere e sottrarre sia i giorni di calendario che i giorni lavorativi. Le festività ufficiali non lavorative sono:

  • Gennaio 1,2,3,4,5,6,8 - Vacanze di Capodanno
  • 7 gennaio - Natale ortodosso
  • 23 febbraio - Giorno del difensore della patria
  • 8 marzo - Giornata internazionale della donna
  • 1 maggio - Festa della primavera e del lavoro
  • 9 maggio - Giorno della vittoria
  • 12 giugno - Giorno della Russia
  • 4 novembre - Giornata dell'Unità Nazionale

Se un giorno festivo cade di sabato o domenica, viene posticipato al giorno lavorativo successivo. Ma a volte il fine settimana viene trasferito in un posto completamente diverso del calendario. Ad esempio, sabato e domenica, che cadevano nelle festività di Capodanno, possono essere spostati a maggio per prolungare le vacanze di maggio.

Nel calcolo dei giorni, il calcolatore tiene conto sia delle festività ufficiali che di tutti i trasferimenti.