1

我一直在盯着这段代码,无法弄清楚它有什么问题,也许一双新的眼睛会有所帮助。

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 永远不会等于功率。任何帮助表示赞赏。

4

4 回答 4

5

你应该做

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

于 2012-06-14T01:20:01.393 回答
1

我看到的一件事是您正在使用 == 而不是 .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;
}
于 2012-06-14T01:19:09.907 回答
1

我看到你正在使用==with BigInteger。不要这样做。改为使用.equals(other)BigInteger不是可以与普通运算符进行比较的原语(您只是在比较对象引用,它们很可能不会相等)。BigInteger此外,在实例上执行计算时,您没有设置任何内容;它们不对本地对象进行操作,并将结果存储在本地对象中。您需要存储返回的对象。

有问题的线路:

  • base.multiply(base);
  • x.add(BigInteger.valueOf(1));

在另一篇关于 SO re 的帖子中也有一些讨论。BigInteger的力量BigIntegerBigInteger.pow(BigInteger)?

于 2012-06-14T01:20:04.437 回答
0

也许我遗漏了一些东西,但这并不像他在做 base.multiply(base) 那样简单。当计算一个权力时,基地应该保持不变。示例 2^3 应生成 2,4,8 的序列,但此代码将生成 2,4,16,因为在第一个循环基数为 4 之后,four.multiple(four) 为 16,而不是 8。我一定错过了某物。

于 2016-12-23T02:11:42.510 回答