web-dev-qa-db-ja.com

うるう年の計算

うるう年を見つけるために、なぜ年を100で割り切れ、400で割り切れなければならないのですか? 4で割り切れる必要がある理由を理解しています。アルゴリズムを説明してください。

46
Ram

1年の長さは(ほぼ)365.242196日です。だから、私たちはそれをフィットさせるために、1日の4分の1を差し引く必要があります:

365.242196-0.25 =364.992196(4年に1日を追加) :しかし、おっと、今では小さすぎます!! 1日の数百を追加することができます(その日を100年に1回追加しないでください:-))

364.992196+ 0,01 =365.002196(おっと、少し大きすぎる、とにかく約400年に一度その日を追加しましょう)

365.002196-1/400 =364.999696

もうすぐそこに、たまにうるう秒で遊ぶだけで設定は完了です。

(注:このステップの後に修正が適用されない理由は、1年も長さが変化するためです!!これが、le秒が最も柔軟なソリューションである理由です。例については here を参照してください)

だからだと思う

100
Peter

wikipedia にうるう年を決定するアルゴリズムがあります:

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

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

76
Georg Schölly

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

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

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

14
Ivan Prodanov

a)年は365.242199日です。

b)毎年365日であれば、100年後には24.2199日を失います。世紀ごとに24日を追加する理由です(100で割り切れる場合を除き、4年ごと)

c)それでも、1世紀あたり0.21299日を失います。したがって、4世紀で0.8796日が失われます。そのため、4世紀ごとに1日を追加します(4世紀ごとにうるう年をカウントします)。

d)しかし、それは4世紀(4世紀)ごとに-0.1204日(今後)失うことを意味します。したがって、8年(3200年)では、うるう年はカウントされません。

e)しかし、それは3200年ごとに0.0368日を失うことを意味します。したがって、24x3200年(= 76800年)で0.8832日を失います。それがwe年を数える理由です。

など...(その時までに私たちは惑星を破壊しているので、それは問題ではありません)

ただし、理解できないのは、400年ではなく500年ごとにうるう年をカウントしない理由です。そのようにすると、より正確に正しい時間に収束します(500時間で2.3時間を失います)。

9

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

if( (year%400==0 || year%100!=0) &&(year%4==0))
    cout<<"It is a leap year";
else
    cout<<"It is not a leap year";
9
x0v

Wikipedia は私よりもうまく説明できると確信していますが、基本的には、4年ごとに余分な日を追加すると、その日のように太陽よりも早くなるという事実と関係があります太陽の周回軌道は365.25日未満なので、400で割り切れない年、たとえば1900にうるう日を追加しないことでこれを補います。

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

6
chillysapien

以下に、javascript三項演算子を使用した wikipediaアルゴリズム の簡単な実装を示します。

isLeapYear = (year % 100 === 0) ? (year % 400 === 0) : (year % 4 === 0);
5
Brad

入力年がうるう年の場合、trueを返します

基本的な現代のコード:

  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年ごとに46BCが始まりましたが、セザールが宣言したように、西暦10年までは一貫していません。しかし、彼らは3年ごとにうるう年を追加しました。それから、その前の年に:Le年は紀元前45年、紀元前42年、紀元前39年、紀元前36年、紀元前33年、紀元前30年、紀元前27年、紀元前24年、紀元前21年、18年でしたBC、BC 15、BC 12、BC 9、AD 8、AD 12年前BC 45うるう年は追加されませんでした。 http://www.wwu.edu/depts/skywise/leapyear.html

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;

最初にグーグルを試してみるべきです。

ウィキペディアには うるう年の説明 があります。 アルゴリズム は、 予後グレゴリオ暦 の説明です。

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

2
Davy Landman

PHP:

// is number of days in the year 366?  (php days of year is 0 based)
return ((int)date('z', strtotime('Dec 31')) === 365);
1
self.name

さらに一歩を進めても、それほど良くはないでしょうか。 3200年ごとにうるう年がないと仮定すると、年の長さが来ます

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

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

1
Sandeep Agrawal

In 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;
    }
1
erhun

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))
0
Samuel

この問題は、「Python 3」の図解ガイド」という本で発見しました。非常に初期の章で、数学演算、ループ、比較、条件なしについてのみ説明しました。特定の年がうるう年かどうかを教えてください。

以下は私が思いついたものです:

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
0
darthwarden

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

つまり、28年ごとにうるう年があり、そのうるう年にはさらに1週間あるはずです...

それはまた、地球が太陽などを回るのに厄介な365.25日を要することにも関係しています。もちろん、実際には365.25ではなく、わずかに少ない(365.242222 ...) 、この矛盾を修正するために、100で割り切れるうるう年を削除することにしました。

0
inspite

これらの規則の理由に興味があるなら、それは地球が太陽の周りを正確に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)。

0
BlueMonkMN

年数が4と400の両方で割り切れるかどうかを確認できます。100で割り切れないかどうかを実際にチェックする必要はありません。オフになっているため、それを補うために、303の通常年(各365日)と97のうるう年(各366日)があります。うるう年ではない3つの余分な年の違いは、400年ごとに繰り返されるグレゴリオ暦とのサイクルを維持することです。クリスチャンツェラーの合同式を調べます。本当の理由を理解するのに役立ちます。お役に立てれば :)

0
Balaji

これが最も効率的な方法だと思います。

Python:

def leap(n):
    if n % 100 == 0:
        n = n / 100
    return n % 4 == 0
0
Mikha'el Wade

現時点では、1年に平均で約365.2425日あります(地球は減速していますが、今のところは無視しましょう)。

4年ごとにうるう年があるのは、平均[(365+365+365+366) / 4 = 365.25, 1461 days in 4 years]で365.25に達するためです。

100の倍数のうるう年がないのは、365.24 `[(1461 x 25-1)/ 100 = 365.24、36,524日を100年で取得するためです。

それから、400の倍数でうるう年を再び持つ理由は、365.2425 [(36,524 x 4 + 1) / 400 = 365.2425, 146,097 days in 400 years]に到達するためです。

私は3600倍で別のルールがあるかもしれないと思っていますが、私はそれをコーディングしたことがありません前に間違っています)。

そのため、ルールの優先度は低くなります。

  • 400の倍数はうるう年です。
  • 100の倍数はうるう年ではありません。
  • 4の倍数はうるう年です。
  • それ以外は年ではありません。
0
paxdiablo

C#の実装

public bool LeapYear()
{
     int year = 2016;

     return year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ? true : false;
}
0
Etnic

かなり曖昧なアイデアがあります。毎年100で割り切れる日が365日になると、この時点で何が行われますか?遠い将来、400で割り切れる年でさえ365日しか得られません。

その後、80で割り切れる年の修正を行う可能性または理由があります。通常の年には365日間があり、400で割り切れる場合は366日間になります。または、これはゆるい状況です。

0
Finn Jensen

単に2000年はうるう年であり、100で割り切れ、4で割り切れるからです。SOが正しいうるうを保証するには、400で割り切れるようにする必要があります。2000%4 = 0 2000%100 = 0アルゴリズムによると、跳躍ではありませんが、400 2000%400 = 0で割り切れるため、跳躍しています。

0
ahmed

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

  1. 年は4で割り切れます。
  2. 年を100で均等に割ることができる場合、うるう年ではありません。
  3. 年は400で均等に割り切れます。その後、うるう年になります。 100で割った年がうるう年ではない理由
0
Milon