总和方差 - 我的方法有什么问题?

时间:2013-07-05 11:16:02

标签: java math sum

我看到大多数人只是循环来添加数字和方块。我尝试了不同的方法。使用我所知道的小数学,我意识到我有一个非常有效的解决方案:

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。分辨

5 个答案:

答案 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();
        }
    }
}