我正在为项目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);
}
}
答案 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