关于Java BigInteger

关于Java BigInteger,java,biginteger,Java,Biginteger,我是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)

我是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;
}
0和1分别定义为BigInteger 0和1类型

我希望I=2除以n=5,如果n模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
...

有人知道为什么会这样吗

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

您正在执行以下操作:

i.add(ONE);
但你应该这样做:

i = i.add(ONE);

i、 addONE必须重新分配:i=i.addONE

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

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

这里有两点

不要使用==测试两个大整数是否相等 要更改BigInteger变量的值,必须执行i=i.addONE;不仅仅是我;。 不使用==来比较大整数的原因是,不是检查数值相等,而是检查它们是否是内存中的同一对象

考虑使用字符串

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

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

顺便说一句,这是一条让你不那么幸运的捷径

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

m==n变为m.compareTon==0 m!=n变成了m.compareTon!=0 mn变为m.compareTon>0 m=0
谢谢你的详细解释!
boolean result = m.compareTo(n) <= 0;