dポイントプレゼントキャンペーン実施中!

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秒以内で終わらせなければテストにパスすることができないようです。

なんとか色々考えてはみたものの、上手いアルゴリズムは思いつきませんでした。
うるう年を処理するための"高速な"アルゴリズムはないのでしょうか。
お知恵を貸してください。よろしくお願いします。

A 回答 (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;
>}
上記にはループなどありませんが、どういったループを
かけたのがわからないと、どこが悪かったのか確認のしよう
が無いと思いますが?
    • good
    • 0
この回答へのお礼

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

スレッド違いのため、管理者に削除依頼を行いました。

お礼日時:2006/06/04 18:16

JAVAの質問の方で答えておきましたが、



400年を単位にして計算して、残りを詳細に調べれば
そんなに多くのループにはならないので早くなると思います。
    • good
    • 0
この回答へのお礼

ありがとうございました。

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

お礼日時:2006/06/04 18:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!