两个不同方块的产物

时间:2012-12-26 13:33:17

标签: algorithm sum logic

是否有任何更短,更有效的方法来找到 如果数字可以由两个不同方数的乘积形成
例如

  • 36 = 4 * 9
  • 144 = 16 * 9

帮助我使用算法或逻辑

4 个答案:

答案 0 :(得分:1)

应该相当容易。记下您的数字并将其分解为素数因子。可以使用各种语言的算法和实现here

一旦掌握了主要因素,那就很容易了。浏览它们,看看你是否有两对相同的数字。

例如:

36 = 2 * 2 * 3 * 3.两对(2和3)。它有效。

144 = 2 * 2 * 2 * 2 * 3 * 3 =>两对(2 * 2和3)。它的工作原理

唯一棘手的部分是重新组合你的素因子,以便你最终得到X = A * A * B * B.但这也不是很难。

答案 1 :(得分:0)

我建议你考虑以下事项:

如果数字是两个不同平方数的乘积,那么它的形式为n,其中对于某些值a和b,n = a ^ 2 * b ^ 2。但是,我们知道a ^ 2 * b ^ 2 =(a * b)^ 2(您可以在上面的两个示例中自行检查)。因此,要知道数字是否是两个正方形的总和,该数字本身必须是正方形数字。

然后剩下的就是弄清楚它是两个不同方形数的乘积 - 这可以通过以下方式完成:

如果n = a ^ 2 * b ^ 2,则对于<> b,n不能等于^ 4。如果n = a ^ 4那么a ^ 2 * b ^ 2 = a ^ 4,这又意味着b ^ 2 = a ^ 2,这最终意味着b = a或-a(你不说你是否计算一个值,为了这个测试的目的,它是负的“不同”。

答案 2 :(得分:0)

这个怎么样?

package Math;
public class NearestNumber {
    public static void main(String[] args) {

        int myNumber = 144;
        int min = (int) Math.sqrt(myNumber);
        int i, j, counter = 0;

        for (i=2;i<min;i++) {
            for (j=i+1;j<=min;j++) {
                if (myNumber == (i*i*j*j)) {
                    System.out.println("Possible combination are " + (i*i) + " and " + (j*j));
                    counter++;
                }
            }
        }
        if (counter==0) {
            System.out.println("No possible combination found!!!");
        }
    }
}

注意:这是打印所有可能的组合,而不是最接近的组合。我相信第一个最接近......

上面的

输出

Possible combination are 4 and 36
Possible combination are 9 and 16

Demo

答案 3 :(得分:0)

你要求逻辑,所以这里。实施很简单。

获取数字并提取其平方根。如果它不是整数,则没有数字A使得A * A = N,因此不能有两个数字,使得B * C = A并且你就在那里停止。

如果根A 整数,则再次提取其根;让它的整数部分为R.循环所有素数在2和R之间并使用它们来计算A.每当你找到一个素数因子A(它除以A而没有余数)时,继续除以该素数,直到你得到一个剩余。你没有余数划分的次数是该素数的幂。把这个素数放在一个列表中,就像它的权力一样多。如果,在划分时,你想出1,那么你就停止了;如果你想出一个大于R的数字,你将它添加到列表中并退出循环。

最后,您将有一个列表,如[3,3,5,5,5,7]。

如果您的设备只有一个成员,则问题无法解决。您可以快速检查,因为在计算R时,您会看到它是整数。如果它也是素数,那么没有小于R的除数,你的集合将是[R],它不能被分成两个非空集。

在您的示例中,您将拥有:

144 -- root is 12
Root of 12 is 3.4, so you need only check from 2 to 3 to fill [ ]
2 divides 12 and you get 6: [ 2 ]
2 divides 6 and you get 3 [ 2 2 ]
2 does not divide 3
3 divides 3 and you get 1 [ 2 2 3 ], so exit.
Factors of 12: [ 2, 2, 3 ]

现在,字典的每个2-partition代表一对合适的数字。例如,您可以:[[3 2],[2]]表示2 ^ 2和(2 * 3)^ 2是合适的候选者,或[[2 2] [3]],这意味着(2 * 2)^ 2和3 ^ 2是合适的候选人。

使用table with the first 1,000 primes,您可以有效地检查最多近5000亿的数字;即使您可能需要BigNum库(libgmp,NumPy,...)才能到达。