• ベストアンサー

x^2+y^2<n^2

指令行の引数に正の整数 n を指定すると,x^2+y^2<n^2となる整数格子点 (x, y)(x>0, y>0)の個数を計算して出力するプログラムで、 n が1億であっても,きちんと個数が計算できるようにしたいのですが、どうしたらよいでしょうか?

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

  • ベストアンサー
  • deadlock
  • ベストアンサー率67% (59/87)
回答No.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; }

shal
質問者

お礼

ありがとうございます。 参考にさせていただきます。

その他の回答 (2)

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.2

桁数が心配ならばjava.math.BigIntegerなどを使えばいいのでは?

shal
質問者

お礼

なるほど、そういったものがあったのですね。 ありがとうございました。

回答No.1

きちんと計算できない理由は何でしょうか? javaのlong型は64ビットなので1億^2の計算をしても問題ないと思いますが。。

関連するQ&A

専門家に質問してみよう