Question

Je l'ai entendu dire qu'il est possible d'y arriver en utilisant l'opérateur % module présent dans la plupart des langages de programmation. La vraie question est, comment? Je ne suis pas familier avec le module fonctionne, donc j'ai eu des difficultés à utiliser dans le passé. Compte tenu de l'heure actuelle ici en secondes depuis 1970, 1307758473.484, comment puis-je calculer combien d'années qui est, jour qui est, heures qui est et minutes qui utilise le module?

Je cherche essentiellement à mettre en forme comme ceci: « 5 ans, 10 jours, 12 heures, 7 minutes et 18,56 secondes. » Comment puis-je faire cela? Je suis vraiment intéressé à apprendre la logique derrière cela et pas intéressé par une baisse en solution simple.

Était-ce utile?

La solution

Quand vous faites la division entière, vous obtenez quotient et le reste. Par exemple,

5 divided by 3 is quotient 1 with remainder 2.

Dans les langages de programmation, ce qui est généralement exprimée sous la forme:

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

La conversion que vous voulez est juste un repeatation de cela. Il est plus facile de commencer à partir de l'unité inférieure et aller plus haut sur .

Tout d'abord, vous avez

  • 1307758473.484 seconds

Depuis 60 secondes est de 1 minute et

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

il est le même que

  • 21795974 minutes 33.484 seconds

Depuis 60 minutes à 1 heure, et

21795974 / 60 = 363266
21795974 % 60 = 14

il est en outre le même que

  • 363266 hours 14 minutes 33.484 seconds

Maintenant, il y a un peu de difficulté. La plupart du temps sont 24 heures. Quand il y a un deuxième saut, ce n'est pas. Si vous ignorez secondes bissextiles et supposons que 1 jour est de 24 heures, puis, en faisant le calcul,

363266 / 24 = 15136
363266 % 24 = 2

il est en outre le même que

  • 15136 days 2 hours 14 minutes 33.484 seconds.

De même, la plupart des années sont de 365 jours. Quand il y a un jour bissextile (année), ce n'est pas. Si vous ignorez jours bissextiles et supposons que 1 an est de 365 jours, en faisant le calcul,

15136 / 365 = 41
15136 % 365 = 171

il est en outre le même que

  • 41 years 171 days 2 hours 14 minutes 33.483 seconds

Autres conseils

Modulus renvoie le reste lors de l'exécution division entière.

Je pense que le plus facile à comprendre comment utiliser Mod en travaillant en arrière à travers un premier problème.

Permet de simple départ avec heures, minutes et secondes -. 1 heure, 10 minutes et 30 secondes pour être précis

D'abord, vous avez 30 secondes. C'est facile - il est juste 30. Pas brainer. Maintenant, ajoutez minutes -. Pour déterminer minutes que vous les secondes fois multiplier 60. Ainsi 10 minutes et 30 secondes = 630 secondes

Maintenant, nous voyons comment fonctionne mod - parce que si vous diviser 630 par 60 vous obtenez 10,5 mais si vous ignorez la vous obtenez la fraction (division entière entière) 10. Le reste est les secondes

Donc, si vous MOD 630 par 60 vous obtenez 30 -. Le reste à gauche sur 630 lors de la division par 30

Donc, pour déterminer minutes et secondes, diviser par 60 pour les minutes et mod de 60 pour les secondes.

Maintenant, ajoutez une heure. Une heure = 60 minutes et 60 minutes est de 60 * 60 secondes pour 1 heure = 3600 secondes. 3600 + 600 + 30 = 4230 secondes.

4230/3600 (1 heure) = 1 - donc nous avons une heure

4230% (mod) 3600 = 630 - saisir cela et maintenant nous traitons pour les minutes

.

Donc, si vous ceci encore étoffer et d'ajouter un jour - 1 jour = 24 heures = 24 * 3600 = 86400 + 3600 + 86 400 600 + 30 = 90630

90630/86400 = 1 -> 1 jour

90630% 86400 = 4230 -> secondes sur

4230/3600 = 1 -> 1 heure

et répéter la logique ci-dessus.

L'espoir qui aide à éclaircir - vous ne cessent de répéter cette itération plus loin et vous pouvez faire des semaines et des années, mais des mois sont spéciaux car ils sont irréguliers, et sont donc les années bissextiles

.

Chaque fois que la conversion d'une petite unité de base (secondes) à une série de grandes unités (minutes / heures / jours / années / décennies / siècles / millénaires), vous pouvez utiliser l'opérateur modulo (%) de garder une trace de la base restante unités que vous extrayez chaque grande unité.

Il est une manière élégante / simple de garder une sorte de course totale dans les unités de base. Commencez à extraire BaseUnits avec la plus grande unité que vous voulez et travailler votre dos de chemin vers le bas jusqu'à ce que vous arriviez à la BaseUnit originale.

Cela ne fonctionne que lorsque l'appareil extrait est non nul. Si c'est zéro, alors vous avez pas d'unités de base extraites du tout et ne nécessitent pas l'opérateur modulo.

Il est important de se rappeler que le résultat de l'opération modulo sera toujours dans l'unité de base d'origine. Cela peut porter à confusion.

Laissez retraiter de 1 million de secondes comme unités de temps plus grandes. Soit 1 an = 31,536,000 secondes et pas des années bissextiles ou d'autres ajustements de calendrier.

#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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top