2

我正在为项目 euler 进行数学挑战,并且在运行程序时遇到了一个奇怪的问题。结果应该是不超过 10,000,000 的所有奇数的总和,但我得到一个负数,我做错了什么?

package program;

import java.util.*;

public class MainClass {

/**
 * @param args
 */
public static void main(String[] args) {

    int total = 0;

    for (int counter = 1; counter < 10000000; counter++) {
        if (!((counter % 2) == 0)) {
            total+=counter;
        }

    }
    System.out.println(total);

}

}

4

4 回答 4

7

使用 along而不是int. 由于整数溢出,您得到一个负数。

于 2012-04-07T19:30:04.467 回答
5

int变量无法容纳总计,因为总计太大。在循环中的某个时刻,您会遇到整数溢出,并且它正在“翻转”为负数:

你需要一个long.

关于风格和效率的问题,我会更改代码以进行迭代,2这样您就不需要进行奇怪的测试:

public static void main(String[] args) {
    long total = 0;
    for (int counter = 1; counter < 10000000; counter += 2) { // iterate by 2
        total += counter;
    }
    System.out.println(total);
}
于 2012-04-07T19:40:03.917 回答
2

您应该在 java 中使用long total = 0;而不是4 个字节,范围从 -2,147,483,648 到 2,147,483,647。int total = 0; int

所以2,147,483,647 + 1 = -2,147,483,648

这个total循环的结果是 25,000,000,000,000 可以容纳long

于 2012-04-07T19:40:11.560 回答
2

只是为这个问题提供更聪明的解决方案(数学!耶)。

你可以更容易地解决这个问题,你只需要知道 1..2n-1 的奇数之和等于 n 的平方。对于那些想尝试的人来说,很容易通过归纳来证明这一点。

无论如何,这意味着 1..X 的总和等于:((X + 1) / 2)**2

于 2012-04-07T19:56:28.573 回答