Java - 添加所有奇数奇怪的行为

时间:2012-04-07 19:28:40

标签: java for-loop

我正在为项目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 个答案:

答案 0 :(得分:7)

使用long代替int。由于整数溢出,你得到一个负数。

答案 1 :(得分:5)

int变量无法保持总数,因为总数太大了。在循环中的某个时刻,你得到一个integer overflow并且它正在“滚动”到一个负数:

您需要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);
}

答案 2 :(得分:2)

您应该使用long total = 0;代替int total = 0; int,其中java 4字节,范围从-2,147,483,648到2,147,483,647。

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

此循环的total为25,000,000,000,000,long可以容纳

答案 3 :(得分:2)

只是为这个问题投入更聪明的解决方案(MATH!yay)。

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

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