0

私が抱えている問題は、コマンドを実行するときにこのコードを理解することです: java Driver 1000000 その戻り値: sum(1000000) = 1784293664

そして、どれだけ長く見ようとしても、コードがこれを行っている理由と方法を理解できません。このコードが実際に数値に対して何をしているのかを理解するのに誰か助けを提供できるかどうか疑問に思っていますか?

class Sum
{
  private int sum;

  public int get() {
    return sum;
  }

  public void set(int sum) {
    this.sum = sum;
  }
}

class Summation implements Runnable
{
  private int upper;
  private Sum sumValue;

  public Summation(int upper, Sum sumValue) {
    this.upper = upper;
    this.sumValue = sumValue;
  }

  public void run() {
    int sum = 0;

    for (int i = 0; i <= upper; i++)
      sum += i;

    sumValue.set(sum);
  }
}

public class Driver
{
  public static void main(String[] args) {
    if (args.length != 1) {
      System.err.println("Usage Driver <integer>");
      System.exit(0);
    }

    if (Integer.parseInt(args[0]) < 0) {
      System.err.println(args[0] + " must be >= 0");
      System.exit(0);
    }

    // Create the shared object
    Sum sumObject = new Sum();
    int upper = Integer.parseInt(args[0]);

    Thread worker = new Thread(new Summation(upper, sumObject));
    worker.start();

    try {
      worker.join();
    } catch (InterruptedException ie) { }
    System.out.println("sum(" + upper + ") = " + sumObject.get());
  }
}

前もって感謝します

アンドリュー

4

1 に答える 1

6

1 から 100 万までの数字を合計すると、次のようになります。

(1 + 1000000) * 1000000 / 2 = 500000500000

intこれにより、合計を保持するために使用しているでオーバーフローが発生します。結果は次のとおりです。

500000500000 (mod 2^32) = 1784293664

a を使用しlongて合計を格納します。最大値が9223372036854775807あり、合計を保持できます。

于 2013-09-24T17:07:07.867 に答える