关于Java BigInteger

use*_*390 0 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) {
      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;
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

并使用基本类型int的等效代码,我得到了预期的结果.

但这与BigInteger一起进入无限循环

n.mod(i) = 1
n = 5
i = 2
...
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么会这样?

Dun*_*nes 10

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

这里有两点.

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

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

考虑一下String.

String a = "a";
String b = "b";

String x = a + b;
String y = "ab";
Run Code Online (Sandbox Code Playgroud)

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

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

除此之外,您的LessserThanOrEqual的快捷方式就是这个.

boolean result = m.compareTo(n) <= 0;
Run Code Online (Sandbox Code Playgroud)

基本上

  • m == nm.compareTo(n) == 0
  • m != nm.compareTo(n) != 0
  • m < nm.compareTo(n) < 0
  • m > nm.compareTo(n) > 0
  • m <= nm.compareTo(n) <= 0
  • m >= nm.compareTo(n) >= 0