计算大整数Java的幂时的无限循环

时间:2012-06-14 01:16:54

标签: java biginteger exponent

我一直盯着这段代码而无法弄清楚它有什么问题,也许一副新鲜的眼睛可能有所帮助。

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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我看到的一件事是您使用==而不是.equals进行比较。用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;
}

答案 2 :(得分:1)

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

问题线:

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

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

的力量{{1}}

答案 3 :(得分:0)

也许我错过了一些东西,但这并不像他正在做base.multiply(base)那样简单。在计算功率时,基座应保持不变。示例2 ^ 3应生成2,4,8的序列,但此代码将生成2,4,16,因为在第一个循环基数为4之后,四个。多个(四个)为16,而不是8。 我一定错过了什么。