我看到大多数人只是循环来添加数字和方块。我尝试了不同的方法。使用我所知道的小数学,我意识到我有一个非常有效的解决方案:
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个自然数的和”和“N个数的平方和”公式。我仍然得到错误的答案。什么可能是错的?
P.S。分辨
答案 0 :(得分:4)
使用此Math.pow( (N * (N+1)) /2, 2)
在N+1
答案 1 :(得分:1)
你的N*N+1
看起来不对劲。 *运算符优先于+运算符,因此它将等于(N*N)+1
。所以请使用N*(N+1)
答案 2 :(得分:0)
你需要
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);
}
这是一个支持测试驱动开发的典型案例。通过这种方法运行一些明显的测试用例,当这些数学拼写错误进入你的代码时,你将节省大量的时间,因为他们不会这样做。
高斯是系列的先驱,他对计算例子上瘾。也许是这样的问题从很小的时候就把这种习惯灌输给了他。
答案 3 :(得分:0)
您必须使用方括号()对操作进行分组
return (long) Math.pow( (N * (N+1)) /2, 2);
因为,在Java *中,优先级高于+,因此如果没有括号,则首先计算N * N.但是预期的是要评估N *(N + 1)。
答案 4 :(得分:0)
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();
}
}
}