gpt4 book ai didi

java - 关于 Java BigInteger

转载 作者:行者123 更新时间:2023-12-01 06:36:27 25 4
gpt4 key购买 nike

我是 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
...

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

最佳答案

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

这里有两点。

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

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

考虑String s。

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

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

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

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

顺便说一句, lesserThanOrEqual 的快捷方式就是这个。

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

基本上

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

关于java - 关于 Java BigInteger,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8928377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com