【发布时间】:2014-01-27 08:45:07
【问题描述】:
以下是解决项目 euler 中问题 6 的两个代码:为什么在我将数字变大之前它们给出的答案相似? (100,000)
前十个自然数的平方和是,
12 + 22 + ... + 102 = 385
前十个和的平方 自然数是,
(1 + 2 + ... + 10)2 = 552 = 3025
因此总和之间的差异 前十个自然数的平方和 总和是 3025 - 385 = 2640。
求第一个平方和之间的差 百个自然数和和的平方。
代码 1:
public class Problem_Six_V2 {
public static void main(String[] args) {
long limit = 100000;
long sum = (limit * (limit + 1)) / 2;
long sumOfSqr = (long)((((2*limit)*limit)+((2*limit)*1)+(1*limit)+(1*1))*limit)/6;
System.out.println(Math.pow(sum, 2) +" "+ sumOfSqr);
System.out.println(Math.pow(sum, 2) - sumOfSqr);
}
}
^^^ 输出 = 2.500016666416665E19
这里是代码二:
public class Problem_Six {
public static void main(String[] args) {
long sum = 0;
long sumSqr = 0;
long sumOfSqr = 0;
for(long i = 1; i <= 100000; i++){
sum += i;
sumOfSqr += Math.pow(i,2);
}
sumSqr = (long) Math.pow(sum, 2);
System.out.println(sumSqr +" "+ sumOfSqr);
System.out.println(sumSqr - sumOfSqr);
}
}
^^ 输出 = 9223038698521425807
我想这与所使用的类型有关,但它们在两个代码中似乎相似..hmm
【问题讨论】:
-
不要使用
Math.pow(sum, 2),只使用sum * sum。 -
您的解决方案似乎是必要的?请参阅下面我对彼得的评论..