平方数是多少?
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_k
到 n_(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.
例如我有一个数字是 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_k
到 n_(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.