Java 有没有办法将任何数字表示为4平方和?

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的限制,则终止循环 编辑: 请看

有没有办法将任何数字表示为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的限制,则终止循环

编辑:
请看我的另一个(更好的)答案,这很难实现,因为如果素数介于两者之间,你永远无法将其分解为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
我的逻辑是:

  • 从数字-1的平方根开始。例如
    SQRT(29)=5-1=4这是我们的第一个学期
  • 取点1)的值,将其平方,再将点1)的平方值相加,看看是否大于N。如果大于N,则将第二个和项减1,并将平方值与1)的值相加
  • 如果前面的平方值项总和小于N,则找到下一个值项并重复2),直到所有4个项相加为N
  • 注意:这是针对您的简单案例。对于复杂的情况,例如323,这可能不起作用

    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)的最大四个正方形。我不认为这是微不足道的,有一个算法与。