- ベストアンサー
x^2+y^2<n^2
指令行の引数に正の整数 n を指定すると,x^2+y^2<n^2となる整数格子点 (x, y)(x>0, y>0)の個数を計算して出力するプログラムで、 n が1億であっても,きちんと個数が計算できるようにしたいのですが、どうしたらよいでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じですか? あまり速くはないですが、10億なら計算できます。100億は途中でオーバーフローします(^^; あと、結果は検証していないので適当な値でチェックしてください。 roopメソッドで計算してます。 mainは適当に書いたので n = Long.parseLong(args[0]) のようにして変換したlong値をroopメソッドに渡してください。 public static void main(String[] args) throws IOException { long n; long end; for (int i = 1; i <= 10; i++) { System.out.println(); n = (long)Math.pow(10, i); count = roop(n); System.out.println("Find " + count + "(N=" + n + ")"); } System.out.println("end."); } private static final long roop(long n) { final long powN = n * n; long count = 0; long x = 1; long rengeX; long pow; for (long y = n - 1; y > 0; y--) { rengeX = powN - y*y; while ((pow = x * x) < rengeX) { if (pow < 0) { throw new IllegalArgumentException(x + ":" + pow); } x++; } count += Math.max(0, x - 1); if (count < 0) { throw new IllegalArgumentException("" + count); } } return count; }
その他の回答 (2)
- Bonjin
- ベストアンサー率43% (418/971)
桁数が心配ならばjava.math.BigIntegerなどを使えばいいのでは?
お礼
なるほど、そういったものがあったのですね。 ありがとうございました。
- JaritenCat
- ベストアンサー率37% (122/322)
きちんと計算できない理由は何でしょうか? javaのlong型は64ビットなので1億^2の計算をしても問題ないと思いますが。。
お礼
ありがとうございます。 参考にさせていただきます。