année bissextile calcul
pour trouver les années bissextiles, pourquoi l'année doit-elle être indivisible par 100 et divisible par 400? Je comprends pourquoi il doit être divisible par 4. Veuillez expliquer l'algorithme.
20 réponses
365.242196 - 0.25 = 364.992196 (en ajoutant 1 jour en 4 ans) : mais Oups, maintenant c'est trop petit!! ajoutons un centième d'un jour (en n'ajoutant pas ce jour une fois par cent ans :-))
364.992196 + 0,01 =365.002196 (oups, un peu trop grand, ajoutons qu'un jour de toute façon temps dans environ 400 ans)
365.002196 - 1/400 = 364.999696
presque là maintenant, il suffit de jouer avec sautsecondes de temps en temps, et vous êtes prêt.
(Note: la raison pour laquelle plus de corrections ne sont appliquées après cette étape est qu'une année change aussi de longueur!!, c'est pourquoi sautsecondes sont la solution la plus flexible, voir par exemple ici)
C'est pourquoi je pense que
Il y a un algorithme sur wikipédia pour déterminer les années bissextiles:
function isLeapYear (year):
if ((year modulo 4 is 0) and (year modulo 100 is not 0))
or (year modulo 400 is 0)
then true
else false
Il y a beaucoup d'informations à ce sujet sur le page de wikipédia sur les années bissextiles, informations inclusives sur les différents calendriers.
en termes généraux, l'algorithme pour calculer une année bissextile est le suivant...
Une année qui sera une année bissextile si elle est divisible par 4 mais pas par 100. Si l'année est divisible par 4 et par 100, ce n'est pas une année bissextile, sauf s'il est aussi divisible par 400.
ainsi les années comme 1996, 1992, 1988 et ainsi de suite sont des années bissextiles parce qu'elles sont divisibles par 4 mais pas par 100. Pour les siècles, la règle des 400 ans est importante. Ainsi, les années du siècle 1900, 1800 et 1700 tandis que tous encore divisible par 4 sont également exactement divisible par 100. Comme elles ne sont plus divisibles par 400, elles ne sont pas des années bissextiles!--1-->
c'est assez pour vérifier si une année est une année bissextile.
if( (year%400==0 || year%100!=0) &&(year%4==0))
cout<<"It is a leap year";
else
cout<<"It is not a leap year";
a) l'année est de 365,242199 jours.
b) si chaque année était de 365 jours, en 100 ans nous perdrions 24,2199 jours. C'est pourquoi nous ajoutons 24 jours par siècle (tous les 4 ans sauf lorsque divisible par 100)
c) mais on perd quand même 0.21299 jours/siècle. Dans 4 siècles, nous perdons 0.8796 jours. C'est pourquoi nous ajoutons 1 jour pour 4 siècles (chaque quatrième siècle compte une année bissextile).
d) mais cela signifie que nous perdons -0,1204 jours (nous allons de l'avant) par quadricentenaire (4 siècle.) Ainsi, en 8 années quadriennales (3200 ans), nous ne comptons pas une année bissextile.
et ainsi de suite... (d'ici là, nous aurons détruit la planète, de sorte qu'il n'a pas d'importance)
ce que je ne comprends pas, c'est pourquoi nous ne comptons pas une année bissextile tous les 500 ans au lieu de 400. De cette façon, nous rapprocherait plus rapidement à l'heure correcte (nous perdrions de 2,3 heures/500 ans).
je suis sûr que Wikipédia peut l'expliquer mieux que moi, mais c'est essentiellement à voir avec le fait que si vous ajoutez un jour supplémentaire tous les quatre ans, nous serions en avance sur le soleil car son temps pour orbiter le soleil est inférieur à 365,25 jours donc nous compensons pour cela en n'ajoutant pas de jours bissextiles sur les années qui ne sont pas divisibles par 400 eg 1900.
Hope qui aide
Voici une simple implémentation du algorithme de Wikipédia, en utilisant l'opérateur ternaire javascript:
isLeapYear = (year % 100 === 0) ? (year % 400 === 0) : (year % 4 === 0);
Vous devriez vraiment essayer de google.
Wikipédia explication des années bissextiles. algorithme votre description est pour le calendrier grégorien proleptique.
pour en savoir plus sur les maths autour de cela, consultez l'article Algorithmes De Calendrier.
Return true si l'année d'entrée est une année bissextile
Base de jour moderne code:
If year mod 4 = 0, then leap year
if year mod 100 then normal year
if year mod 400 then leap year
else normal year
la règle D'Aujourd'hui a commencé 1582 après J.-C. La règle du calendrier julien avec chaque 4ème année commencée 46 avant JC mais n'est pas cohérente avant 10 après JC comme déclaré par Cesar. Ils ont cependant ajouté quelques années bissextiles tous les 3 ans de temps en temps dans les années avant: Les années bissextiles étaient donc 45 avant JC, 42 avant JC, 39 avant JC, 36 avant JC, 33 avant JC, 30 avant JC, 27 avant JC, 24 avant JC, 21 avant JC, 18 avant JC, 15 avant JC, 12 avant JC, 9 avant JC, 8 après JC, 12 après JC Avant L'année 45BC année bissextile n'a pas été ajouté. http://www.wwu.edu/depts/skywise/leapyear.html
L'an 0 n'existe pas comme il est ...2BC 1BC 1AD 2AD... pour certains calculs, cela peut être un problème.
function isLeapYear(year: Integer): Boolean;
begin
result := false;
if year > 1582 then // Todays calendar rule was started in year 1582
result := ((year mod 4 = 0) and (not(year mod 100 = 0))) or (year mod 400 = 0)
else if year > 10 then // Between year 10 and year 1582 every 4th year was a leap year
result := year mod 4 = 0
else //Between year -45 and year 10 only certain years was leap year, every 3rd year but the entire time
case year of
-45, -42, -39, -36, -33, -30, -27, -24, -21, -18, -15, -12, -9:
result := true;
end;
end;
Ne vaudrait-il pas mieux faire un pas de plus? En supposant que tous les 3200 année non bissextile, la longueur de l'année viendra
364.999696 + 1/3200 = 364.999696 + .0003125 = 365.0000085
et après cela, l'ajustement sera nécessaire après environ 120000 ans.
PHP:
// is number of days in the year 366? (php days of year is 0 based)
return ((int)date('z', strtotime('Dec 31')) === 365);
les années Bissextiles sont arbitraires, et le système utilisé pour les décrire est un homme fait construire. Il n'y a pas de pourquoi.
ce que je veux dire c'est qu'il pourrait y avoir une année bissextile tous les 28 ans et nous aurions une semaine de plus dans ces années bissextiles ... mais les puissances qui ont décidé de faire un jour tous les 4 ans pour rattraper.
c'est aussi à cause de la Terre qui prend 365,25 jours pour faire le tour du soleil, etc. Bien sûr, ce n'est pas vraiment 365,25 est-ce un peu moins ( 365.242222...), donc pour corriger cet écart, ils ont décidé de supprimer les années bissextiles divisibles par 100.
si vous êtes intéressé par les raisons de ces règles, c'est parce que le temps qu'il faut à la terre pour faire exactement une orbite autour du Soleil est une longue valeur décimale imprécise. Ce n'est pas exactement 365.25. Il est légèrement inférieur à 365,25, donc tous les 100 ans, un jour de leap doit être éliminé (365,25 - 0,01 = 365,24). Mais ce n'est pas tout à fait correct. La valeur est légèrement supérieure à 365.24. Ainsi, seulement 3 fois sur 4, la règle des 100 ans s'appliquera (ou en d'autres termes, additionnez en 1 jour tous les 400 ans; 365.25 - 0.01 + 0.0025 = 365.2425).
la raison pour laquelle nous avons des années bissextiles tous les 4 ans est que cela nous amène à 365,25 en moyenne [(365+365+365+366) / 4 = 365.25, 1461 days in 4 years]
.
la raison pour laquelle nous n'avons pas d'années bissextiles sur les multiples de 100 est de nous amener à 365,24 `[(1461 x 25 - 1) / 100 = 365.24, 36,524 des jours dans 100 ans.
alors la raison pour laquelle nous avons encore une fois une année bissextile sur 400-multiples est de nous 365.2425 [(36,524 x 4 + 1) / 400 = 365.2425, 146,097 days in 400 years]
.
je crois qu'il peut y avoir une autre règle à 3600-multiples mais je n'ai jamais codé pour elle (Y2K était une chose, mais la planification pour un millier et demi d'années dans le futur n'est pas nécessaire à mon avis - gardez à l'esprit que j'ai eu tort avant).
Donc, les règles sont, en priorité décroissant:
- multiple de 400 est une année bissextile.
- multiple de 100 n'est pas une année bissextile.
- multiple de 4 est bissextile an.
- rien d'autre n'est une année bissextile.
Voici un plutôt obsqure idée. Lorsque chaque année divisible par 100 obtient 365 jours, que doit être fait à ce moment? Dans un avenir lointain, quand même les années divisibles avec 400 seulement peuvent obtenir 365 jours.
il y a alors une possibilité ou une raison de faire des corrections en années divisibles par 80. Les années normales auront 365 jours et ceux divisibles avec 400 peuvent obtenir 366 jours. Ou est-ce un libre-libre de la situation.
vous pouvez simplement vérifier si le nombre D'années est divisible par 4 et 400. Vous n'avez pas vraiment besoin de vérifier si elle est indivisible par 100. La raison pour laquelle 400 est remise en question Est que selon le calendrier grégorien, notre "durée journalière" est légèrement diminuée, et donc pour compenser cela, nous avons 303 années régulières (365 jours chacune) et 97 années bissextiles (366 jours chacune). La différence de ces 3 années supplémentaires qui ne sont pas des années bissextiles est de rester dans le cycle avec le calendrier grégorien, qui répète tous les 400 an. Cherche L'équation de congruence de Christian Zeller. Cela aidera à comprendre la vraie raison. Espérons que cela aide :)
Dans le calendrier Grégorien 3 critères doivent être pris en compte pour cerner les années bissextiles:
- l'année est également divisible par 4;
- Si l'année peut être divisée par 100, ce n'est PAS une année bissextile, à moins d';
- l'année est également divisible par 400. Alors, c'est une année bissextile. pourquoi l'année divisée par 100 n'est pas l'année bissextile
Python 3.5
def is_leap_baby(year):
if ((year % 4 is 0) and (year % 100 is not 0)) or (year % 400 is 0):
return "{0}, {1} is a leap year".format(True, year)
return "{0} is not a leap year".format(year)
print(is_leap_baby(2014))
print(is_leap_baby(2012))
Java
le code ci-dessous calcule le nombre d'années bissextiles entre deux années données. Déterminer le commencement et le point de fin de la boucle.
static int calculateLeapYearCount(int year, int startingYear) {
int min = Math.min(year, startingYear);
int max = Math.max(year, startingYear);
int counter = 0;
for (int i = min; i < max; i++) {
if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) {
counter = counter + 1;
}
}
return counter;
}
a écrit dans le Café-Script:
is_leap_year = ( year ) ->
assert isa_integer year
return true if year % 400 == 0
return false if year % 100 == 0
return true if year % 4 == 0
return false
# parseInt? that's not even a word.
# Let's rewrite that using real language:
integer = parseInt
isa_number = ( x ) ->
return Object.prototype.toString.call( x ) == '[object Number]' and not isNaN( x )
isa_integer = ( x ) ->
return ( isa_number x ) and ( x == integer( x ) )
bien sûr, la vérification de validité faite ici va un peu plus loin que ce qui a été demandé, mais je trouve que c'est une chose nécessaire à faire dans une bonne programmation.
notez que les valeurs de retour de cette fonction d'indiquer les années bissextiles dans le " calendrier gregorien, donc pour l'an 1400, il indique false
, alors qu'en fait cette année une année bissextile, selon les utilisé calendrier julien. je va encore laisser comme tel dans le datetime bibliothèque, je suis en train d'écrire parce que l'écriture de code correct pour traiter rapidement des dates devient étonnamment complexe, donc je ne soutenir le calendrier grégorien (ou payé pour un autre).