【发布时间】:2020-07-26 07:45:34
【问题描述】:
我有一个问题是找到任何数字的 2 次幂(没有任何幂的数字,例如 5 将返回 null),幂是和 2 个整数,当添加幂以返回所述数字时。以下是一些示例:
4 -> {2, 2}
5 -> null
6 -> null
7 -> null
8 -> {2, 3}
10 -> null
etc...
虽然我下面的代码可以工作,但是它太慢了,当通过问题时(大约 100 个 integer.max 值)它会占用设定的时间(16 秒),我可以优化这段代码吗?
public static int[] isPerfectPower(int n) {
int limit = (int)Math.round((n/((double)5/2)));
for (int i = 2; i <= limit; i++) {
double result = Math.pow(n, (double)1/i);
result = (double)Math.round(result * Math.pow(10, 10)) / Math.pow(10, 10);
if((result == Math.floor(result))) return new int[] {(int)result, i};
}
return null;
}
【问题讨论】:
-
@backdoor 感谢您的回复,但可以详细说明这如何加快我的代码速度?
-
您的代码很好,但您的
limit太大了。鉴于pow(2, 31) = 2147483648超出了Javaint的范围,您的幂指数不可能大于30,因此您永远不需要大于30的limit。对于较小的n,您可以使用较小的限制,但从简单的角度来看,简单地为所有n硬编码30的限制就足够了。 (如果你想变得花哨,你也可以测试 2 的幂,那么你需要考虑的最大指数是19,因为pow(3, 20)对于 Javaint来说又太大了。) -
@MarkDickinson:您应该将其发布为答案!
标签: java algorithm performance math