总和方差 - 我的方法有什么问题?
我看到大多数人只是循环添加数字和他们的正方形。我尝试了不同的方法。使用小数学,我知道,我意识到我有这是一个非常有效的解决方案:公式“N数字的平方和”
public static long sumOfNSquares(int N){
// This is the standard mathematical formula I learnt in grade 10
return (long) (N*(N+1)*(2*N+1))/6;
}
public static long squareofSum(int N){
// Another standard mathematical formula. I took a square of it
return (long) Math.pow((N * N+1) /2, 2);
}
public static void main(String [] args){
System.out.println(Math.abs(sumOfNSquares(100) - squareofSum(100)));
}
它使用标准的“N自然数之和”和。仍然我得到错误的答案。什么可能是错的?
p.s.议决
你需要
public static long squareofSum(int N){
// Another standard mathematical formula. I took a square of it
return (long) Math.pow((N * (N+1)) /2, 2);
}
这有利于测试驱动开发的一个典型案例。通过这种方法运行一些明显的测试用例,当那些数学拼写错误进入你的代码时,你将会节省很多时间,因为他们不愿意这样做。
高斯是系列的先驱,他沉迷于计算例子。也许是这样的问题,从小就把习惯灌输给他。
您的N*N+1
看起来不对。 *运算符优先于+运算符,因此它将等于(N*N)+1
。因此,使用N*(N+1)
你必须用括号()到组的操作
return (long) Math.pow((N * (N+1)) /2, 2);
因为,在Java *拥有超过+更大的优先权,因此如果没有括号则N * N先求。但是,预计会有N *(N + 1)被评估。
其实,第一个支架是不必要的。公式是n * (n + 1)*(2n + 1)/ 6. –
对不起,我错过了它 – MohamedSanaulla
感谢罗布指出它,我已经改变了我的答案 – MohamedSanaulla
import java.util.*;
public class soq {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
long N = input.nextLong();
while (N > 2) {
long sumSquares = 0, sum = 0, difference = 0;
for (int i = 1; i <= N; i++) {
sum += i;
sumSquares += Math.pow(i, 2);
}
difference = (long) (Math.pow(sum, 2) - sumSquares);
System.out.println(difference);
N = input.nextInt();
}
}
}
你会得到什么答案? –
你有没有试图比较你的数学解决方案和防弹环?另外,'N * N + 1'看起来很可疑 –
因此SO应该有另一个选项来关闭:'User error'。在这种情况下,用户明显地放置了'('比这些应该是更早的几个字符。 – devnull