是否有任何更短,更有效的方法来找到
如果数字可以由两个不同方数的乘积形成
例如
帮助我使用算法或逻辑
答案 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
答案 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,...)才能到达。