• ベストアンサー

うるう年判定のアルゴリズム

javaでうるう年判定のプログラムを作成しています。 プログラム自体はサーバにアップするときに実行結果が正しいかどうかテストされます。 仕様としては、 1.時間に関するAPIなどは一切使わずに完全に自作 2.入力される値はLong型の"秒"数(APIで提供されているのはミリ秒ですが) 3.60537895631062456(Long値) などの入力値に対して、年/月/日 (曜日) 時:分:秒 yday=元旦からの経過日数 を出力 最初は以下の関数を使用してループをかけていたのですが、仕様3の入力値に対して50秒近くかかってしまい、上手くいきませんでした。 public static int isLeap(int year){ if(year%4==0 && (year%100!=0 || year%400==0)) return 1; return 0; } 問題点はループ回数が多いことで、作る時点で分かってはいたのですが、ここまで遅くなるとは思っても見ませんでした。 これを使わない方法としては、一回だけうるう年(=n)を見つけ、その後は「(n+4)との比較+100で割り切れず400で割り切れる場合は別」という処理を行うことによって、処理時間を30秒付近にまで短縮することができたのですが、どうも10~15秒以内で終わらせなければテストにパスすることができないようです。 なんとか色々考えてはみたものの、上手いアルゴリズムは思いつきませんでした。 うるう年を処理するための"高速な"アルゴリズムはないのでしょうか。 お知恵を貸してください。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • don_go
  • ベストアンサー率31% (336/1059)
回答No.2

>3.60537895631062456(Long値) などの入力値に対して ↑は何の値でしょうか? (特定の年の元旦からの経過秒数?または任意の年月日?) 起点の年月日が既知であれば、それがうるう年か否かはすぐ わかるはずですが? >最初は以下の関数を使用してループをかけていたの >ですが、仕様3の入力値に対して50秒近くかかって >しまい、上手くいきませんでした。 > >public static int isLeap(int year){ >if(year%4==0 && (year%100!=0 || year%400==0)) >return 1; >return 0; >} 上記にはループなどありませんが、どういったループを かけたのがわからないと、どこが悪かったのか確認のしよう が無いと思いますが?

hydrangeas0722
質問者

お礼

1970年1月1日0:0:0 からの経過時間(秒)です。 それに対し、時,分,秒を求めた後、経過年数を求めようとしていました。 この問題に関してはJAVAのスレッドで解決していただきました。 真剣に考えて頂き、本当にありがとうございました。 スレッド違いのため、管理者に削除依頼を行いました。

その他の回答 (1)

  • amru05
  • ベストアンサー率63% (33/52)
回答No.1

JAVAの質問の方で答えておきましたが、 400年を単位にして計算して、残りを詳細に調べれば そんなに多くのループにはならないので早くなると思います。

hydrangeas0722
質問者

お礼

ありがとうございました。 スレッドを間違えて申し訳ありません。 管理者に削除依頼をしておきました。

関連するQ&A

専門家に質問してみよう