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

问题描述:

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

我看到大多数人只是循环添加数字和他们的正方形。我尝试了不同的方法。使用小数学,我知道,我意识到我有这是一个非常有效的解决方案:公式“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.议决

+0

你会得到什么答案? –

+2

你有没有试图比较你的数学解决方案和防弹环?另外,'N * N + 1'看起来很可疑 –

+0

因此SO应该有另一个选项来关闭:'User error'。在这种情况下,用户明显地放置了'('比这些应该是更早的几个字符。 – devnull

使用此Math.pow((N * (N+1)) /2, 2)

使用大括号围绕N+1

+0

非常感谢!真的很差的错误... – Aditya

你需要

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)被评估。

+0

其实,第一个支架是不必要的。公式是n * (n + 1)*(2n + 1)/ 6. –

+0

对不起,我错过了它 – MohamedSanaulla

+1

感谢罗布指出它,我已经改变了我的答案 – 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(); 
     } 
    } 
} 
+0

这是正确的,但th e法官考虑时间限制exc我可以做些什么来让它更快更快 – jack

+0

你的意思是你写的是什么? – jack

+0

伙计我很抱歉,但我不明白 – jack