55

閏年を見つけるために、年が 100 で割り切れず、400 で割り切れる必要があるのはなぜですか?

4 で割り切れなければならない理由がわかりました。アルゴリズムを説明してください。

4

27 に答える 27

88

ウィキペディアには、うるう年を決定するためのアルゴリズムがあります。

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

うるう年に関するウィキペディアのページには、このトピックに関する多くの情報があり、さまざまなカレンダーに関する情報が含まれています。

于 2009-04-07T11:01:52.777 に答える
15

一般的に、うるう年を計算するためのアルゴリズムは次のとおりです...

4 で割り切れるが 100 で割り切れない年はうるう年です。4 と 100 で割り切れる年は、400 で割り切れない限りうるう年ではありません。

したがって、1996 年、1992 年、1988 年などの年は、4 で割り切れるが 100 で割り切れないため、閏年です。100 年の場合、400 ルールが重要です。したがって、1900 年、1800 年、1700 年の 1900 年、1800 年、1700 年の世紀は、すべて 4 で割り切れますが、100 でも正確に割り切れます。これらは 400 で割り切れないため、うるう年ではありません。

于 2009-04-07T11:01:46.503 に答える
11

これは、ある年がうるう年かどうかを確認するのに十分です。

if( (year%400==0 || year%100!=0) &&(year%4==0))
    cout<<"It is a leap year";
else
    cout<<"It is not a leap year";
于 2014-08-30T09:39:39.163 に答える
6

ウィキペディアは私よりもうまく説明できると確信していますが、基本的には、4 年ごとに 1 日余分に追加すると、太陽を周回する時間が太陽よりも短いため、太陽よりも先に進むという事実に関係しています。 365.25 日であるため、1900 などの 400 で割り切れない年にはうるう日を追加しないことでこれを補います。

それが役立つことを願っています

于 2009-04-07T11:04:30.320 に答える
4

入力年がうるう年なら真を返す

基本的な現代のコード:

  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

今日の規則は西暦 1582 年に始まり、ユリウス暦の規則は 4 年ごとに紀元前 46 年に始まりますが、セザールが宣言したように西暦 10 年より前には一貫していません。しかし、彼らは3年ごとに閏年を追加し、それ以前の数年間は閏年を追加しました: したがって、閏年は紀元前45年、紀元前42年、紀元前39年、紀元前36年、紀元前33年、紀元前30年、紀元前27年、紀元前24年、紀元前21年、紀元前18年でした。紀元前、紀元前 15 年、紀元前 12 年、紀元前 9 年、西暦 8 年、西暦 12 年 紀元前 45 年より前 閏年は追加されませんでした。

0 年は存在しません ...2BC 1BC 1AD 2AD... 計算によっては、これが問題になる可能性があります。

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;
于 2014-03-12T12:52:45.850 に答える
2

あなたは本当に最初にグーグルを試してみるべきです.

ウィキペディアにうるう年の説明があります。あなたが説明しているアルゴリズムは、Proleptic Gregorian calendar用です。

これに関する数学の詳細については、カレンダー アルゴリズム( PDF ) の記事を参照してください。

于 2009-04-07T11:05:30.583 に答える
1

さらに一歩進んだら、それほど良くなることはないでしょうか。3200年ごとにうるう年がないと仮定すると、1年の長さは次のようになります。

364.999696 + 1/3200 = 364.999696 + .0003125 = 365.0000085

この後、約120000年後に調整が必要になります。

于 2011-12-28T14:55:43.263 に答える
1

以下のコードではJava、指定された 2 つの年の間のうるう年の数を計算します。ループの開始点と終了点を決定します。

次に、パラメータ モジュロ 4 が 0 に等しく、パラメータ モジュロ 100 が 0 に等しくない場合、またはパラメータ モジュロ 400 がゼロに等しい場合、うるう年であり、カウンタを増やします。

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;
    }
于 2017-01-07T19:20:18.860 に答える
0

年数が 4 と 400 の両方で割り切れるかどうかを確認するだけで済みます。実際に 100 で割り切れるかどうかを確認する必要はありません。400 が疑問視される理由は、グレゴリオ暦によると、「日の長さ」がわずかにそれを補うために、通常の年は 303 年 (それぞれ 365 日) と、うるう年は 97 年 (それぞれ 366 日) あります。閏年ではない余分な 3 年の違いは、400 年ごとに繰り返されるグレゴリオ暦の周期に合わせることです。Christian Zeller の合同方程式を調べてください。本当の理由を理解するのに役立ちます。お役に立てれば :)

于 2014-05-01T00:33:25.577 に答える
0

グレゴリオ暦では、うるう年を識別するために 3 つの基準を考慮する必要があります。

  1. 年は 4 で割り切れます。
  2. 年が 100 で割り切れる場合、うるう年ではありません。
  3. また、年は 400 で割り切れます。それからうるう年です。年を100で割ると閏年ではない理由
于 2014-11-26T09:39:36.260 に答える
0

パイソン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))
于 2016-12-25T17:19:31.230 に答える
0

ここで、かなりあいまいなアイデアが生まれます。100で割り切れる年が365日になったとき、このとき何をすべきか。400で割り切れる年でも365日しかない遠い未来。

次に、80 で割り切れる年に修正を行う可能性または理由があります。通常の年は 365 日で、400 で割り切れる年は 366 日になります。それとも、これはルーズルーズな状況ですか。

于 2013-04-22T12:00:58.310 に答える
0

うるう年は恣意的であり、うるう年を記述するために使用されるシステムは人工的な構造です。理由はありません。

私が言いたいのは、28年ごとにうるう年があった可能性があり、それらのうるう年には1週間余分にあるということです...しかし、権力は追いつくために4年ごとに1日にすることを決定しました.

また、地球が太陽を一周するのに厄介な 365.25 日かかることにも関係しています 100で割り切れる年。

于 2009-04-07T11:07:36.023 に答える
0

これらの規則の理由に興味がある場合は、地球が太陽の周りを正確に 1 周するのにかかる時間が、長く不正確な 10 進数値であるためです。正確には 365.25 ではありません。これは 365.25 よりわずかに小さいため、100 年ごとにうるう日を 1 日削除する必要があります (365.25 - 0.01 = 365.24)。しかし、それも正確ではありません。値は 365.24 よりわずかに大きくなります。したがって、100 年ルールが適用されるのは 4 回のうち 3 回だけです (つまり、400 年ごとに 1 日を足し戻すと、365.25 - 0.01 + 0.0025 = 365.2425)。

于 2009-04-07T11:13:06.010 に答える
0

C# 実装

public bool LeapYear()
{
     int year = 2016;

     return year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ;
}
于 2019-05-26T10:39:36.193 に答える
-2

これをCoffee-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 ) )

もちろん、ここで行われる有効性チェックは、要求されたものよりも少し進んでいますが、優れたプログラミングでは必要なことだと思います。

この関数の戻り値は、いわゆる先発グレゴリオ暦のうるう年を示していることに注意してください。したがって、1400 年については を示しますfalseが、実際には、当時使用されていたユリウス暦によると、その年はうるう年でした。日付を処理するための正しいコードを書くと驚くほど複雑になるため、私が書いているdatetimeライブラリにはそのまま残します。

于 2011-08-21T21:05:44.343 に答える