我一直盯着这段代码,无法弄清楚它出了什么问题,也许一双新鲜的眼睛会有所帮助。
public static BigInteger powerOfBigInteger (BigInteger base, BigInteger power){
if (power == BigInteger.valueOf(0)){
return BigInteger.valueOf(1);
}
if (power == BigInteger.valueOf(1)){
return base;
}
BigInteger x = BigInteger.valueOf(1);
while (x != power ){
base.multiply(base);
x.add(BigInteger.valueOf(1));
System.out.println(x + " " + power);
return base;
}
return base;
我运行这个,显然 x 永远不会等于权力。任何帮助,不胜感激。
你应该这样做
if (BigInteger.ZERO.equals(power)) return BigInteger.ONE;
if (BigInteger.ONE.equals(power)) return base;
并且您必须累积乘法和加法的结果,因为 BigInteger 是不可变的并返回新的 BigInteger 实例
无限循环是因为你的x永远不会改变 - 应该是
x = x.add(BigInteger.ONE);
乘法应更改为
result = result.mulitply(base);
其中初始结果值应为 BigInteger.ONE
我看到的一件事是你正在使用 == 而不是 .equals 进行比较。 比较对象与相等。
public static BigInteger powerOfBigInteger (BigInteger base, BigInteger power){
if (power.equals(BigInteger.valueOf(0))){
return BigInteger.valueOf(1);
}
if (power.equals(BigInteger.valueOf(1))){
return base;
}
BigInteger x = BigInteger.valueOf(1);
while (!x.equals(power)){
base.multiply(base);
x.add(BigInteger.valueOf(1));
System.out.println(x + " " + power);
return base;
}
return base;
}
我看到您正在将==
与BigInteger
一起使用.别这样。请改用.equals(other)
。 BigInteger
不是可以与普通运算符进行比较的基元(您只是比较对象引用,它们很可能不会相等)。此外,在BigInteger
实例上执行计算时,您不会设置任何内容;它们不对本地对象进行操作,而是将结果存储在本地对象中。您需要存储返回的对象。
有问题的台词:
-
base.multiply(base);
-
x.add(BigInteger.valueOf(1));
在另一篇关于SO re的帖子中也有一些讨论。 BigInteger
BigInteger
的力量:BigInteger.pow(BigInteger)?
也许我错过了一些东西,但这不是他正在做base.multiply(base)那么简单吗?在计算功率时,基础应保持给定状态。示例 2^3 应该生成 2,4,8 的序列,但此代码将生成 2,4,16,因为在第一个循环基数为 4 之后,four.multiple(four) 为 16,而不是 8。我一定错过了什么。