如何在java中添加两个任意长度的数字?

2022-09-03 09:17:35

如何在java中添加两个任意长度的数字?

例如,在java中,长整型大小为64位。因此,最大范围是-9223372036854775808 9223372036854775807。我说的对吗?

因此,如果我们想添加一个大于这个数字的数字,如下所示,我得到了一个错误

“整数太大”

long a = 9223372036854775807L;
long b = 9223372036854775808L;

在C中,我们可以将这些数字作为char数组,通过遍历每个char的地址并使用一些数据结构,我们可以将两个任意大小的数字相加。

如何做到这一点 java.我们可以遍历 String 中每个字符的地址吗?


感谢您的回复。

我尝试通过将数字作为字符串传递并从末尾添加每个字符来编码。它对我来说工作正常。

使用BigInteger将两个非常大的数字相加与我上面指定的方法之间有什么大区别吗(从末尾添加每个字符并将余数存储在临时变量中并继续)。BigInteger的底层机制是否与我的代码相同(从末尾添加每个字符)?

谢谢。


答案 1

您可以使用 BigInteger

BigInteger a = new BigInteger("9223372036854775807");
BigInteger b = new BigInteger("9223372036854775808");
BigInteger result = a.add(b);

将允许您使用任何大小的数字,但与 或 相比,您将损失相当大的性能。BigIntegerlongint


答案 2

将允许您使用任何大小的数字,但与 或 相比,您将损失相当大的性能。BigIntegerlongint

实际上,如果您只需要运行此操作一次(用户输入两个数字,然后返回结果),则使用即可。但是,如果您需要多次执行加法运算,则可以使用自己的大整数实现。当我参加ACM比赛时,我们经常使用自己的基于char数组的实现(C++)。我建议使用以下代码。假设有两个整数数组,A和B.A[0]B[0]存储相应数字的透镜。A[i]B[i] 存储数字本身。A[1]B[1]是最低有效位数。因此,数字 1234 将对应于这样的数组:{4,4,3,2,1}。BigInteger

现在,假设我们要对这些数字求和,并以相同的格式将它们存储在数组C中。下面是一个可以使用的代码示例:

int len1 = A[0],  len2 = B[0], divisor = 0;
int len = len1 >= len2 ? len1 : len2;
for (int i=1;i<=len;i++) {
  if (i>len1) C[i] = B[i]+divisor;
  else if (i>len2) C[i] = A[i]+divisor;
  else C[i] = A[i]+B[i]+divisor;
  divisor = C[i]/10;
  C[i] %= 10;
}
while (divisor>0) {
  C[++len] = divisor%10;
  divisor /= 10;
}
C[0] = len;

该代码使用简单的算术加法规则,并且应该比一般实现快得多。玩得开心使用它。BigInteger