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

Posted

技术标签:

【中文标题】计算大整数的幂时的无限循环Java【英文标题】:Infinite Loop During Calculation of Power of Big Integers Java 【发布时间】:2012-06-14 01:16:54 【问题描述】:

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

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

【问题讨论】:

为什么要实现这个方法? BigInteger 已经有一个 pow(int) 方法,对于任何太大而无法容纳在 int 中的功能,无论如何都会耗尽您的内存。 【参考方案1】:

你应该这样做

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

【讨论】:

谢谢。我不将 x 设置为新值是多么愚蠢,我不完全理解 BigInteger。【参考方案2】:

我看到的一件事是您使用 == 而不是 .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;

【讨论】:

【参考方案3】:

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

有问题的线路:

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于计算大整数的幂时的无限循环Java的主要内容,如果未能解决你的问题,请参考以下文章

使用 OnetoMany 和 ManytoOne 映射时的无限递归循环(双向)

无限循环计算阶乘问题

Apache Spark:从IDE远程运行作业时的无限循环

覆盖 initWithCoder 时的无限循环

为啥我的代码在执行时的初始嵌套 for 循环中进入无限循环?

确定文件大小时的Python无限循环