Domanda

Ho sentito che è possibile ottenere questo risultato utilizzando il modulo % operatore presente nella maggior parte dei linguaggi di programmazione. La vera domanda è: come? Sono familiarità con il modo modulo funziona, quindi ho avuto difficoltà ad usarlo in passato. Dato il tempo presente qui in secondi a partire dal 1970, 1307758473.484, come posso calcolare quanti anni vale a dire, i giorni che è, ora che è, e minuti che utilizza il modulo?

sto essenzialmente cercando di formattare in questo modo: "5 anni, 10 giorni, 12 ore, 7 minuti e 18,56 secondi". Come faccio a fare questo? Sono molto interessato a conoscere la logica alla base di questo e non interessato a un semplice drop-in soluzione.

È stato utile?

Soluzione

Quando si esegue la divisione intera, si ottiene quoziente e resto. Ad esempio,

5 divided by 3 is quotient 1 with remainder 2.

In linguaggi di programmazione, questo di solito è espresso come:

5 / 3   # => 1
5 % 3   # => 2

La conversione si vuole è solo un repeatation di questo. E 'più facile per iniziare dall'unità inferiore e andare più in alto sulla .

In primo luogo, è necessario

  • 1307758473.484 seconds

Dal 60 secondi è di 1 minuto, e

1307758473.484 / 60 = 21795974  (intended to be integer division)
1307758473.484 % 60 = 33.484,

è lo stesso di

  • 21795974 minutes 33.484 seconds

Dal 60 minuti è di 1 ora, e

21795974 / 60 = 363266
21795974 % 60 = 14

è ulteriormente la stessa

  • 363266 hours 14 minutes 33.484 seconds

Ora, c'è un po 'di difficoltà. Quasi tutti i giorni sono 24 ore. Quando v'è un secondo salto, non lo è. Se si ignora secondo salto e si assume 1 giorno è di 24 ore, poi, facendo il calcolo,

363266 / 24 = 15136
363266 % 24 = 2

è ulteriormente la stessa

  • 15136 days 2 hours 14 minutes 33.484 seconds.

Allo stesso modo, la maggior parte sono anni 365 giorni. Quando c'è un giorno bisestile (anno), non lo è. Se si ignora giorni bisestili e assumere che 1 anno è di 365 giorni, poi facendo il calcolo,

15136 / 365 = 41
15136 % 365 = 171

è ulteriormente la stessa

  • 41 years 171 days 2 hours 14 minutes 33.483 seconds

Altri suggerimenti

Modulus restituisce il resto quando si esegue divisione di interi.

Penso che sia più semplice per capire come utilizzare Mod da all'indietro lavoro attraverso un primo problema.

Consente di inizio semplice con ore, minuti e secondi -. 1 ora, 10 minuti e 30 secondi per la precisione

In primo luogo, hai 30 secondi. Questo è facile - è solo 30. bazzecola. Ora aggiungere minuti -. Per determinare minuti come secondi moltiplicarli volte 60. Così 10 minuti e 30 secondi = 630 secondi

Ora vediamo come funziona la mod - perché se si divide 630 del 60 si ottiene 10.5, ma se si ignora la frazione (intera divisione intera) si ottiene 10. Il resto è i secondi

Quindi, se si MOD 630 del 60 si ottiene 30 -. Il resto resta quando dividendo 630 del 30

Quindi, per determinare minuti e secondi, dividere per 60 per i minuti, e mod del 60 per i secondi.

A questo punto aggiungere un'ora. Un'ora = 60 minuti e 60 minuti è 60 * 60 secondi in modo 1 ora = 3600 secondi. 3600 + 600 + 30 = 4230 secondi.

4230/3600 (1 ora) = 1 - quindi abbiamo uno ora

4230% (mod) 3600 = 630 - afferrare questo e ora abbiamo processo per i minuti

.

Quindi, se la carne questo fuori ulteriormente e aggiungere una giornata - 1 giorno = 24 ore = 24 * 3600 = 86400 86400 + 3600 + 600 + 30 = 90630

90630/86400 = 1 -> 1 giorno

90630% 86400 = 4230 -> secondi rimasto

4230/3600 = 1 -> 1 ora

e ripetere la logica di cui sopra.

La speranza che aiuta a chiarire l'alto - si continua a ripetere che l'iterazione più e si può fare settimane e anni, ma mesi sono speciali perché sono irregolari, e così sono gli anni bisestili

.

Ogni volta che la conversione da una piccola unità di base (secondi) ad una serie di unità più grandi (minuti / ore / giorni / anni / decenni / secoli / millenni) è possibile utilizzare l'operatore modulo (%) per tenere traccia della base rimanenti unità come si estraggono ogni grande unità.

Si tratta di un modo elegante / semplice per mantenere una sorta di esecuzione totale in unità di base. Inizia l'estrazione BaseUnits con la più grande unità che si desidera e lavorare la schiena verso il basso fino ad arrivare alla BaseUnit originale.

Questo funziona solo quando l'unità estratta è diverso da zero. Se è zero, allora avete estratto nessuna unità di base a tutti e non è necessario l'operatore modulo.

E 'importante ricordare che il risultato dell'operazione modulo sarà sempre nell'unità di base originale. Che può diventare confuso.

Facciamo ribadire 1 milione di secondi come unità di tempo più grandi. Lasciate 1 anno = 31,536,000 secondi e senza anni bisestili o altri aggiustamenti di calendario.

#include <cstdio>
#define SEC2CENT 3153600000
#define SEC2DEC 315360000
#define SEC2YR 31536000
#define SEC2MONTH 2592000
#define SEC2WEEK 604800
#define SEC2DAY 86400
#define SEC2HOUR 3600
#define SEC2MIN 60
main()
{
unsigned int sec = 1000000; //I am 1 million seconds old or...

unsigned int centuries = sec / SEC2CENT;
if (centuries) sec = sec % SEC2CENT; //if nonzero update sec

unsigned int decades = sec / SEC2DEC;
if (decades) sec = sec % SEC2DEC; //the purpose of modulo for units is this running total of base units

unsigned int years = sec / SEC2YR;
if (years) sec = sec % SEC2YR;

unsigned int months = sec / SEC2MONTH;
if (months) sec = sec % SEC2MONTH;

unsigned int weeks = sec / SEC2WEEK;
if (weeks) sec = sec % SEC2WEEK;

unsigned int days = sec / SEC2DAY;
if (days) sec = sec % SEC2DAY;

unsigned int hours = sec / SEC2HOUR;
if (hours) sec = sec % SEC2HOUR;

unsigned int minutes = sec / SEC2MIN;
if (minutes) sec = sec % SEC2MIN;

unsigned int seconds = sec; //seconds should now be less than 60 because of minutes

printf("I am now exactly %u centuries, %u decades, %u years, %u months, %u weeks, %u days, %u hours, %u minutes, %u seconds old and that is very old indeed.", centuries, decades, years, months, weeks, days, hours, minutes, seconds);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top