平方数是多少?

How many counts the square number?

例如我有一个数字是 55。我可以检查这个数字的平方创建这个数字的次数。

例如我有 55 所以,我从 5 个数字中知道这个数字总数,它们是

55 = 1^2+ 2^2+ 3^2+ 4^2 + 5^2(totally 5* number)

我发现 55 的计数是 5。我怎样才能找到任何数字。有什么公式或等式吗?我不想知道哪个数字的平方。我只想知道有多少个数字方块创建了这个数字。在我的示例中,我的答案是 5。但是如果我可以计算这 10 位数字,那么任何数字都太复杂了。

例如,如果我的号码是 652369。我怎样才能找到总共有多少个号码?我只想找出有多少个数字。我很抱歉我的英语。我正在使用 Delphi 编程语言。

注意:数字不是每次都"consecutive"。

前n个平方和有一个闭式公式:

1^2 + 2^2 + ... + n^2 = n(n+1)(2n+1)/6

要回答你的问题,你必须"invert"上面的函数;换句话说,你需要解方程

n(n+1)(2n+1)/6 = 55 or 2n^3 + 3n^2 + n - 330 = 0

求解此类方程的一种方法是使用牛顿法。我们有

f(n) = 2n^3 + 3n^2 + n - 330
f'(n) = 6n^2 + 6n + 1

然后您进行初步猜测(例如,n_0 = (330/2)^(1/3),因为 3 是主导力量)并使用公式

改进该猜测
n_(k+1) = n_k - f(n_k)/f'(n_k)

当从 n_kn_(k+1) 的变化足够小时,您可以终止算法。

我不知道 Delphi 所以这是 Java 中的一个实现。

public class SumOfSquares {
  public static double f(double x) {
    return ((2*x+3)*x+1)*x;
  }

  public static double fp(double x) {
    return (6*x+6)*x+1;
  }

  public static void main(String[] args) {
    int target = Integer.parseInt(args[0]);
    double guess = Math.pow(target/2.0,1/3.0);
    double epsilon = 0.00001;

    double x0, x1;
    x1 = guess;
    do {
      x0 = x1;
      x1 = x0 - (f(x0)-6*target)/fp(x0);
    } while (Math.abs(x0-x1)>epsilon);

    System.out.println(x1);

    // check                                                                    
    int sum = 0;
    for (int i=0; i<=Math.floor(x1); i++) {
      sum += i*i;
    }
    System.out.println(sum);
  }
}

java SumOfSquares 55 打印出 5.0,并检查 5^2 以内的平方和为 55。java SumOfSquares 652369 打印出 124.5855... 这表明 652369 不完全是广场。它下面的平方和是643250.