【问题标题】:about Java BigInteger关于 Java BigInteger
【发布时间】:2012-01-20 01:11:10
【问题描述】:

我是 Java 新手,只是用 BigInteger 编写程序。

public static void main(String[] args) {
  BigInteger n = new BigInteger("5");
  BigInteger i = new BigInteger("2");
  while (lesserOrEqual(i,n) {
    System.out.println("n.mod(i) = "+n.mod(i));
    if (n.mod(i) == ZERO) {
      n = n.divide(i);
    }
    else {
      i.add(ONE);
  }
  System.out.println("n = "+n);
  System.out.println("i = "+i);
}


public static boolean lesserOrEqual(BigInteger m, BigInteger n) `{
  if (m.compareTo(n) == -1 || m.compareTo(n) == 0)
    return true;
  return false;
}

ZERO 和 ONE 分别定义为 BigInteger 0、1 类型。

我希望“i=2”除以“n=5”,如果“n mod i == 0”,否则“i++”,直到“n”小于或等于“i​​”。

我认为输出一定是

n.mod(i) = 1
n = 5
i = 3
n.mod(i) = 2
n = 5
i = 4
n.mod(i) = 1
n = 5
i = 5
n.mod(i) = 0
n = 1
i = 5

使用原始类型 int 的等效代码,我得到了预期的结果。

但是 BigInteger 会进入无限循环

n.mod(i) = 1
n = 5
i = 2
...

有人知道为什么会这样吗?

【问题讨论】:

    标签: java biginteger


    【解决方案1】:

    BigInteger 类将整数表示为不可变对象。

    这里有两点。

    1. 不要使用== 来测试两个BigIntegers 是否相等
    2. 要更改 BigInteger 变量的值,您必须执行 i = i.add(ONE); 而不仅仅是 i.add(ONE);

    不使用== 来比较BigIntegers 的原因是,不是检查数值相等,而是检查它们是否是内存中的同一个对象。

    考虑Strings。

    String a = "a";
    String b = "b";
    
    String x = a + b;
    String y = "ab";
    

    在上面的示例中,x.equals(y) 为真,因为它们包含相同数量的字符且顺序完全相同。但是,x == y 不正确,因为它们是内存中的不同对象。

    您需要将算术运算的结果分配给变量的原因是因为 BigInteger 是不可变的。因此算术运算不能改变它正在操作的对象的值,但它可以创建一个新的 BigInteger(它返回)。这就是为什么您必须将算术运算的结果分配给您想要保存的变量的原因。

    顺便说一句,你的 lesserThanOrEqual to 的捷径就是这个。

    boolean result = m.compareTo(n) <= 0;
    

    基本上

    • m == n 变为 m.compareTo(n) == 0
    • m != n 变为 m.compareTo(n) != 0
    • m &lt; n 变为 m.compareTo(n) &lt; 0
    • m &gt; n 变为 m.compareTo(n) &gt; 0
    • m &lt;= n 变为 m.compareTo(n) &lt;= 0
    • m &gt;= n 变为 m.compareTo(n) &gt;= 0

    【讨论】:

    • 谢谢你的详细解释!
    【解决方案2】:

    以上两个答案都是正确的。然而,他们并没有告诉您 BigInteger 实例是不可变的。这意味着它们一旦设置就不会改变。这就是为什么您需要始终分配转换结果...

    【讨论】:

      【解决方案3】:

      你正在这样做:

      i.add(ONE);
      

      但你应该这样做:

      i = i.add(ONE);
      

      【讨论】:

        【解决方案4】:

        您没有保存从i.add(ONE) 返回的结果。它为您提供了一个包含所需值的 BigInteger 对象,但您将其放在地板上而不是分配给 i

        【讨论】:

          【解决方案5】:

          i.add(ONE) 必须重新分配:i = i.add(ONE)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-08-20
            • 2012-11-30
            • 1970-01-01
            • 1970-01-01
            • 2014-06-15
            • 2010-12-13
            • 1970-01-01
            相关资源
            最近更新 更多