Pour trouver des années bissextiles, pourquoi cette année doit-elle être indivisible par 100 et divisible par 400? Je comprends pourquoi elle doit être divisible par 4. Veuillez expliquer l’algorithme.
La durée d'une année est de (plus ou moins) 365,242196 jours . Nous devons donc soustraire, plus ou moins, un quart de jour pour l'adapter:
365.242196 - 0,25 = 364.992196 (en ajoutant 1 jour sur 4 ans): mais oups, maintenant c'est trop petit !! ajoutons un centième de jour (en n’ajoutant pas ce jour une fois tous les cent ans :-))
364.992196 + 0,01 = 365.002196 (oups, un peu trop grand, ajoutons quand même ce jour-là une fois dans environ 400 ans)
365.002196 - 1/400 = 364.999696
Presque là maintenant, il suffit de jouer avec des secondes et de temps en temps, et vous êtes prêt.
(Remarque: la raison pour laquelle plus aucune correction n’est appliquée après cette étape est qu’une année change également. C’est pourquoi la durée la plus courte est la solution la plus flexible, voir par exemple ici )
C'est pourquoi je suppose
Il existe un algorithme sur wikipedia 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 sur ce sujet sur la page wikipedia au sujet des années bissextiles , informations complètes sur différents calendriers.
En termes généraux, l'algorithme de calcul d'une année bissextile est le suivant ...
Une année sera une année bissextile si elle est divisible par 4 mais pas par 100. Si une année est divisible par 4 et par 100, ce n'est pas une année bissextile à moins de la diviser également par 400.
Ainsi, des années telles que 1996, 1992, 1988, etc., sont des années bissextiles, car elles sont divisibles par 4 mais pas par 100. Pour un siècle, la règle des 400 est importante. Ainsi, les années 1900, 1800 et 1700, bien qu’elles soient toutes divisibles par 4, sont également divisibles par 100. Elles ne sont pas divisibles par 400. Elles ne sont donc pas divisées par 400.
a) L'année est 365.242199 jours.
b) Si chaque année durait 365 jours, nous perdrions 24.2199 jours sur 100 ans… C'est pourquoi nous ajoutons 24 jours par siècle (tous les 4 ans SAUF lorsque divisible par 100)
c) Mais nous perdons quand même 0.21299 jours/siècle. Nous perdons donc 0,8796 jours en 4 siècles ... C'est pourquoi nous ajoutons 1 jour sur 4 siècles (nous comptons une année bissextile sur 4 siècles).
d) Mais cela signifie que nous perdons -0.1204 jours (nous avançons) par quadricentenaire (4 siècles). Donc, dans 8 quadricentenaires (3200 ans), nous ne comptons pas une année bissextile.
e) Mais cela signifie que nous perdons 0.0368 jours par 3200 ans. Donc, en 24x3200 ans (= 76800 années), nous perdons 0.8832 jours. C'est pourquoi nous comptons une année bissextile.
et ainsi de suite ... (d'ici là, nous aurons détruit la planète, donc peu importe)
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 convergerions plus rapidement vers le bon moment (nous perdrions 2,3 heures/500 ans).
cela suffit 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";
Je suis sûr que Wikipedia peut l'expliquer mieux que moi, mais c'est essentiellement lié au fait que si vous ajoutez une journée supplémentaire tous les quatre ans, nous aurons une longueur d'avance sur le Soleil. Le soleil dure moins de 365,25 jours, nous compensons donc cela en n’ajoutant pas de jours bissextiles aux années non divisibles par 400, par exemple 1900.
J'espère que cela pourra aider
Voici une implémentation simple de l'algorithme wikipedia , à l'aide de l'opérateur javascript ternary:
isLeapYear = (year % 100 === 0) ? (year % 400 === 0) : (year % 4 === 0);
Renvoie true si l'année d'entrée est une année bissextile
Code de base moderne:
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é en 1582 après JC La règle du calendrier julien commence tous les 4 ans avec 46 ans, mais n'est pas cohérente avant 10 après JC, comme l'a déclaré César . Ils ont cependant ajouté quelques années bissextiles tous les 3 ans, puis les années précédentes: Les années bissextiles étaient donc de 45 av. J.-C., 42 av. J.-C., 36 av. J.-C., 36 av. J.-C., 30 av. J.-C., 27 av. . Avant l'année 45BC, l'année bissextile n'a pas été ajoutée . http://www.wwu.edu/depts/skywise/leapyear.html
L'année 0 n'existe pas telle qu'elle est ... 2BC 1BC 1AD 2AD ... pour certains calculs, cela peut poser 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;
Vous devriez vraiment essayer de google en premier.
Wikipedia a une explication des années bissextiles . Le algorithme que vous décrivez est pour le calendrier Proleptic Gregorian .
Vous trouverez plus d’informations sur les mathématiques à ce sujet dans l’article Algorithmes du calendrier .
PHP:
// is number of days in the year 366? (php days of year is 0 based)
return ((int)date('z', strtotime('Dec 31')) === 365);
Ne ferons-nous pas bien mieux si nous faisons un pas de plus… __. En supposant que chaque année 3200 ne soit pas une année 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.
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))
J'ai trouvé ce problème dans le livre "Guide illustré de Python 3". C'est au tout début du chapitre que nous ne discutions que des opérations mathématiques: pas de boucle, pas de comparaison, pas de condition. Comment pouvez-vous savoir si une année donnée est une année bissextile?
Voici ce que je suis venu avec:
y = y % 400
a = y % 4
b = y % 100
c = y // 100
ly = (0**a) * ((1-(0**b)) + 0**c) # ly is not zero for leap years, else 0
Les années bissextiles sont arbitraires et le système utilisé pour les décrire est une construction créée par l'homme. Il n'y a pas de pourquoi.
Ce que je veux dire, c’est qu’il aurait pu y avoir une année bissextile tous les 28 ans et que nous aurions une semaine supplémentaire ces années bissextiles ... mais les pouvoirs qui ont été décidés pour en faire un jour tous les quatre ans.
Cela a également à voir avec le fait que la terre a pris 365,25 jours pour faire le tour du soleil, etc. Bien sûr, ce n’est pas vraiment 365,25, c’est un peu moins ( 365.242222 ... ). décidé de supprimer les années bissextiles divisibles par 100.
Si les raisons de ces règles vous intéressent, c'est que le temps qu'il faut à la Terre pour se placer exactement sur une orbite autour du Soleil est une longue valeur décimale imprécise. Ce n'est pas exactement 365.25. C'est un peu moins de 365,25, donc tous les 100 ans, un jour bissextile doit être éliminé (365,25 - 0,01 = 365,24). Mais ce n'est pas tout à fait correct non plus. La valeur est légèrement supérieure à 365,24. La règle des 100 ans ne s'appliquera donc que trois fois sur quatre (ou, en d'autres termes, rajouter en une journée tous les 400 ans; 365,25 - 0,01 + 0,0025 = 365,2425).
Vous pouvez simplement vérifier si le numéro de l'année est divisible par 4 et par 400. Vous n'avez pas vraiment besoin de vérifier s'il est indivis par 100. La raison pour laquelle 400 est mise en question est parce que, selon le calendrier grégorien, notre 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 des 3 années supplémentaires qui ne sont pas des années bissextiles est de rester en cycle avec le calendrier grégorien, qui se répète tous les 400 ans. Recherchez l'équation de congruence de Christian Zeller. Cela aidera à comprendre la vraie raison. J'espère que cela t'aides :)
Il y a en moyenne 365,2425 jours par an en ce moment (la Terre ralentit, mais ignorons-le pour l'instant).
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 100 est de nous obtenir 365,24 `[(1461 x 25 - 1)/100 = 365,24, 36 524 jours sur 100 ans.
Ensuite, la raison pour laquelle nous avons encore une année bissextile sur 400-multiples est de nous amener à 365.2425 [(36,524 x 4 + 1) / 400 = 365.2425, 146,097 days in 400 years]
.
Je pense qu’il existe peut-être une autre règle à 3600-multiples, mais je ne l’ai jamais codée (l’an 2000 était une chose, mais planifier à l’avenir un an et demi n’est pas nécessaire, à mon avis. N'oubliez pas que je suis mal avant).
Donc, les règles sont, en priorité décroissante:
Voici une idée plutôt obsolète ... Quand chaque année divisible avec 100 obtient 365 jours, que doit-on faire à ce moment? Dans le futur lointain, quand même les années divisibles avec 400 seulement peuvent obtenir 365 jours.
Il est alors possible ou justifié d'apporter des corrections aux années divisibles par 80 . Les années normales auront 365 jours et celles pouvant être divisées par 400 peuvent obtenir 366 jours. Ou est-ce une situation lâche?.
Simplement Parce que l’an 2000 est une année bissextile, divisible par 100 et divisible par 4 . SO, pour garantir que le saut est correct, nous devons nous assurer qu’il est divisible par 400 . 2000% 4 = 0 2000% 100 = 0 Selon l'algorithme, il ne s'agit pas d'un saut, mais il est divisible par 400 2000% 400 = 0 Donc, c'est un saut.
Dans le calendrier grégorien, trois critères doivent être pris en compte pour identifier les années bissextiles:
Dans Java
ci-dessous, le code calcule le nombre d'années bissextiles entre deux années données. Déterminez les points de départ et d'arrivée de la boucle.
Ensuite, si le paramètre modulo 4 est égal à 0 et que le paramètre modulo 100 n'est pas égal à 0 ou que le paramètre modulo 400 est égal à zéro, il s'agit d'une année bissextile et d'un compteur d'augmentation.
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;
}