我最近在接受采访时被要求编写一个程序来检查一个数字是否可以用A ^ B的形式表示。我无法解决问题,因为我甚至没有正确的方法来解决问题。
以下是一些例子
Input = 4
Output = true
因为它可以表示为2 ^ 2
Input = 536870912
Output = true
因为它可以表示为2 ^ 29
Input = 1024000000
Output = true
因为它可以表示为2 ^ 16 * 5 ^ 6 = 32000 ^ 2
有人可以为这个问题提供解决方案(最好使用Java)吗?
答案 0 :(得分:2)
如果你想要一个已知X的答案X = A B ,同时A≥2和B≥2并且都是整数,那么最短的搜索对于B = 2..n进行A = B √X,直到A <1。 2。
public static void findPower(double value) {
if (value < 1 || value % 1 != 0)
throw new IllegalArgumentException("Invalid input: " + value);
boolean found = false;
for (int exp = 2; ; exp++) {
long base = Math.round(Math.pow(value, 1.0 / exp));
if (base < 2)
break;
if (Math.pow(base, exp) == value) {
System.out.printf("%.0f = %d ^ %d%n", value, base, exp);
found = true;
}
}
if (! found)
System.out.printf("%.0f has no solution%n", value);
}
<强> TEST 强>
findPower(4);
findPower(123_456);
findPower(536_870_912);
findPower(1_024_000_000);
findPower(2_176_782_336d);
findPower(205_891_132_094_649d);
<强>输出强>
4 = 2 ^ 2
123456 has no solution
536870912 = 2 ^ 29
1024000000 = 32000 ^ 2
2176782336 = 46656 ^ 2
2176782336 = 1296 ^ 3
2176782336 = 216 ^ 4
2176782336 = 36 ^ 6
2176782336 = 6 ^ 12
205891132094649 = 14348907 ^ 2
205891132094649 = 59049 ^ 3
205891132094649 = 729 ^ 5
205891132094649 = 243 ^ 6
205891132094649 = 27 ^ 10
205891132094649 = 9 ^ 15
205891132094649 = 3 ^ 30