Java 有没有办法将任何数字表示为4平方和?
有没有办法将任何数字表示为4个平方的和 例如,29可以表示为5^2+2^2+0^2+0^2 我尝试了下面的代码,但有些数字给出了5个术语,例如23为4^2+2^2+1^2+1^2 我尝试的代码是:Java 有没有办法将任何数字表示为4平方和?,java,Java,有没有办法将任何数字表示为4个平方的和 例如,29可以表示为5^2+2^2+0^2+0^2 我尝试了下面的代码,但有些数字给出了5个术语,例如23为4^2+2^2+1^2+1^2 我尝试的代码是: x=0; while(num!=0){ x=(int)Math.floor(Math.sqrt(num)); num=num-(x*x); } 代码没有问题 23只需要5个术语即可解决 尝试计数项数,如果达到4的限制,则终止循环 编辑: 请看
x=0;
while(num!=0){
x=(int)Math.floor(Math.sqrt(num));
num=num-(x*x);
}
代码没有问题 23只需要5个术语即可解决 尝试计数项数,如果达到4的限制,则终止循环 编辑:
请看我的另一个(更好的)答案,这很难实现,因为如果素数介于两者之间,你永远无法将其分解为1的平方根;比如说, 以11为例 3^2--现在剩下2个,它没有平方根,小于这个的数是“1”,1^(n)总是1。。所以总是有一个提醒
因此,你可能需要遵循其他答案所建议的某种算法…与波希米亚人所说的不同,我用4个术语解决了23个问题,如下所示:
23 = 3^2 + 3^2 + 2^2 + 1^2
29 = 4^2 + 3^2 + 2^2 + 0^2
和29如下:
23 = 3^2 + 3^2 + 2^2 + 1^2
29 = 4^2 + 3^2 + 2^2 + 0^2
我的逻辑是:
SQRT(29)=5-1=4代码>这是我们的第一个学期
323 = 17^2 + 4^2 + 3^2 + 3^2
请记住,当您找到x项时,该项的值小于或等于x-1(上一个)项的值。这是您的算法代码 这将给你所有可能的组合
int n, t1, t2, t;
n = 29;//Your number
for (int i = (int) Math.sqrt(n / 4); i * i <= n; i++) {
t1 = n - i * i;
for (int j = (int) Math.sqrt(t1 / 3); j <= i && j * j <= t1; j++) {
t2 = t1 - j * j;
for (int k = (int) Math.sqrt(t2 / 2); k <= j && k * k <= t2; k++) {
t = (int) Math.sqrt(t2 - k * k);
if (t <= k && t * t == t2 - k * k) {
System.out.println("(" + i + "^2) + (" + j + "^2) + ("+ k + "^2) + ("+ t +"^2)");
}
}
}
}
intn,t1,t2,t;
n=29//你的号码
对于(inti=(int)Math.sqrt(n/4);i*i所以,我不能忘记这一点,而是使用动态编程,特别是内存化,用Java解决它
以下是相关信息:
private final Map<Integer, int[]> memo = new HashMap<Integer, int[]>();
/**
* @param n
* the number
* @return int[]
*/
public int[] solveFor(final int n) {
if (memo.containsKey(n)) {
return memo.get(n);
}
final int[] a = new int[4];
a[0] = (int) Math.floor(Math.sqrt(n));
if (sumOfSquares(a) < n) {
int[] b = solveFor(n - a[0] * a[0]);
while (a[0] > 0 && b[3] > 0) {
// won't fit
a[0]--;
b = solveFor(n - a[0] * a[0]);
}
System.arraycopy(b, 0, a, 1, 3);
}
memo.put(n, a);
return a;
}
private final Map memo=new HashMap();
/**
*@param n
*号码
*@return int[]
*/
公共整数[]解算器(最终整数n){
如果(备忘录容器(n)){
返回备忘录。获取(n);
}
最终整数[]a=新整数[4];
a[0]=(int)Math.floor(Math.sqrt(n));
如果(平方米(a)0&&b[3]>0){
//不合适
a[0]-;
b=求解(n-a[0]*a[0]);
}
系统阵列副本(b,0,a,1,3);
}
备忘录.付诸表决(不适用);
返回a;
}
在这个2.4GHz的i5上,它可以在不到3秒内计算出从0到2000000的所有分解
当然,明显的缺点是,如果要求它计算一个大的整数,它可能会很快耗尽内存。但如果只要求它计算4200万,它可以在几毫秒内写出正确的答案
我也很确定它仍然可以改进/优化,特别是如果它发现余数的解太长而无法在剩余空间中求解,那么只会减少第一个项的部分,但我将把它作为一个练习留给数学技能更好、有更多空闲时间的人。:在最初回答错误之后,我想我应该把它编好:这个解决方案很有效
我已经测试过这段代码,它在O(logn)时间内执行,最多可以执行非常大的数字(在旧macbook pro上,在75毫秒内求解n=Long.MAX_值)
我知道23需要5个条件,但我希望你能给我一些建议,把任何数字表示为四的平方和terms@Bohemain,已被证明,23个问题可以用4个术语解决(见我的答案)这位6小时前的精英绅士在发帖时喝咖啡休息了很久。我在30分钟内发布了我的答案。使用29,从点1)得到值4,这是我们的第一项。现在,我们使用第一项值作为第二个和项,并将其从1)添加到第一个和项的平方值,例如4^2+4^2=32。因为32>29,我们将第二个值项减1,所以4变为3。现在我们再次测试,4^2+3^2=25。25<29,让我们找到第三个求和项。再次循环第2点,直到找到所有4个术语。最多循环4个术语。这就是你所能做的。给定一个数n,我们如何保证使用上面的逻辑我们可以找到4个数,使得它们的平方和等于number@TheEliteGentleman让我们确切地说。如果你仔细研究OP提出的算法,它会将11分解为3,1,1。蛮力远远不是最优的,甚至是不可用的。@b战神你能推荐一些更好的选择吗?已经证明它可以解决O(logn)中的问题。这不是一个可行的解决方案。请尝试9223372036854775800(我很好奇)。@nneonneo通过此代码需要50毫秒才能正确完成。令人恼火的是,四年过去了,我不完全清楚我为什么问你这个问题。然而,我确实注意到,您的算法似乎不是O(logn)-如果假设一个数字没有组合,您的算法将测试每个组合,因为似乎是O(sqrt(n)^4)或O(n^2)工作。@nneo是的,我怀疑测试性能是一个挑战。我有点害怕它会超时。我同意你在最坏情况下对算法的评估,但(显然)一旦成功,它收敛速度足够快。试试这一个,可能是1000000000L。在我的机器上需要60秒。问题是它试图找到不需要像@nneonneo指出的那样接近sqrt(N)的最大四个正方形。我不认为这是微不足道的,有一个算法与。