0 comments
0 trackbacks

今回は各月の日数をテーブル化
MonthDay = {0,31,28,31,30,31,30,31,31,30,31,30,31}
普通にテーブル化するとこうなります。

今回はテーブル化の時点でうるう年を考慮してしまおうと思います。

うるう年は,
(1)4年に一度
(2)100で割り切れる年の場合は,うるう年として考慮しない
(3)400で割り切れる年の場合は,(1)に該当する場合でもうるう年として考慮する
なので,今年の年の変数をyとすると,

普通に考えると,if(y % 4 == 0)のとき28日,さらにif(y % 100 == 0)のときは29日,if(y % 400 == 0)のときは28日となるように分岐させていけば求めることができます。
それでも良いのですが,それだと長くなってしまいます。

そこで,別に考えて見たいと思います。
4年に一度の部分を
1 / (y % 4 + 1) 」
とします。

値を入れてみるとわかると思いますが,4で割り切れるときは1になります。
同様に100年と400年ごとの場合も考えていきます。
これらを踏まえると,2月の日数は

2月の日数 = 28 + (1 / (y % 4 + 1)) * (1 - 1 / (y % 100 + 1)) + (1 / (y % 400 + 1))

と求めることができます!

今回の各月の日数テーブルは
MonthDay = {0,31,28 + (1 / (y % 4 + 1)) * (1 - 1 / (y % 100 + 1)) + (1 / (y % 400 + 1)),31,30,31,30,31,31,30,31,30,31};

となります。



スポンサーサイト
 ↑↑↑↑↑↑よければクリックをお願いします↓↓↓↓↓↓
0 comments
0 trackbacks

ある日付「2005年1月1日」などから現在までどのくらい日数が経ったのか,経過日数を計算していくアルゴリズムについて考えて行きたいと思います

まずいくつかのことに注意して考えて行きたいと思います。
・日付で考える。
・閏年(うるう年)を考慮する。
・開始年月日をちゃんと考慮する。


①日付について
うるう年は考えないでおきます。各月の日数は以下のようになっています
   1月:31日    2月:28日   3月:31日
   4月:30日   5月:31日   6月:30日
   7月:31日    8月:31日  9月:30日
   10月:31日   11月:30日  12月:31日

そのために年・月・日で分けて考えずに日付により経過日数を求めていきます。

②うるう年について
うるう年は
(1)4年に一度
(2)100で割り切れる年の場合は,うるう年として考慮しない
(3)400で割り切れる年の場合は,(1)に該当する場合でもうるう年として考慮する
 (3)については2000年がそうでした。

③開始日について
これは「2005年1月1日」から「2005年1月2日」までだと1日経過なので,「2005年1月1日」は考慮する必要がないということです



 ↑↑↑↑↑↑よければクリックをお願いします↓↓↓↓↓↓