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

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

比如说,在java中长度是64位。 所以最大范围是-9223372036854775808到9223372036854775807.我是对的吗?

因此,如果我们想要添加一个比下面更大的数字,我得到一个错误

“整数太大”

长a = 9223372036854775807L;
长b = 9223372036854775808L;

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

怎么做java。 我们可以遍历String中每个字符的地址。


谢谢你的回复。

我试图通过将数字作为字符串传递并从末尾添加每个字符来进行编码。 这对我来说可以。

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

谢谢。

您可以使用BigInteger

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

BigInteger可以让你使用任何大小的数字,但是你会在longint失去相当多的性能。

使用BigInteger 。 这是一个例子。

示例代码(基于以上链接) –

 BigInteger reallyBig1 = new BigInteger("1234567890123456890"); BigInteger reallyBig2 = new BigInteger("2743534343434361234"); reallyBig = reallyBig.add(reallyBig2); 

BigInteger可以让你使用任何大小的数字,但是你会在longint失去相当多的性能。

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

现在,假设我们想要对这些数字求和并将它们以相同的格式存储在数组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一般实现快得多。 使用它玩得开心。

查看BigInteger类。 它将能够在非常大的数字上执行您正在寻找的操作。

http://download.oracle.com/javase/1.4.2/docs/api/java/math/BigInteger.html

使用BigInteger和我在上面指定的方法添加两个非常大的数字之间有什么大的区别(从结尾添加每个字符并在临时变量中存储余数并继续)。

不同之处在于您可以使用更大的基数。 假设基数是10000,而不仅仅是10.当我之前的答案的代码将被修改为这样:

 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]/10000; C[i] %= 10000; } while (divisor>0) { C[++len] = divisor%10000; divisor /= 10000; } C[0] = len; 

在这种情况下,代码运行速度提高了4倍(因为算术运算中的虚拟机没有区别,因为它们仅依赖于常量)。 而且,这意味着整数数组将小4倍。 这导致的唯一问题是如何格式化输出。

创建一个堆栈类,从用户那里获取数字作为字符串,并将它们转换为字符串并将它们推入堆栈。 在这里,我编写了完整的代码,用于添加两个大数字。 堆栈类也包括在内。 只需输入cmd javac mystack.java然后输入java mystack

 import java.util.*; public class mystack { int maxsize=0; int top=-1; int array []=new int [0]; public mystack (int size) { maxsize=size; array=new int [maxsize]; } public void push (int x) { top=top+1; array[top]=x; } public int pop () { int elt=array[top]; top--; return elt; } public boolean stackisfull() { return(top==maxsize-1); } public boolean stackisempty() { return(top==-1); } public int peak () { int peak =array[top]; return peak; } public static void main (String args[]){ Scanner in=new Scanner (System.in); System.out.println("Enter the 1st number"); String number1 = in.nextLine(); System.out.println(); System.out.println("Enter the 2nd number"); String number2 = in.nextLine(); System.out.println(); String temp=""; if(number1.length()>number2.length()) { temp=number1; number1=number2; number2=temp; } int k=0; mystack S1 = new mystack (number1.length()); for(int i=0;i 
  import java.math.BigInteger; import java.util.Scanner; public class BigIntergerSumExample { public static void main(String args[]) { BigInteger number1; BigInteger number2; BigInteger sum; Scanner sc = new Scanner(System.in); System.out.println("Enter the value of number 1"); number1 = sc.nextBigInteger(); System.out.println("Enter the value of number 2"); number2 = sc.nextBigInteger(); BigInteger a = new BigInteger(""+number1); BigInteger b = new BigInteger(""+number2); BigInteger result = a.add(b); System.out.println("Sum is Two numbers : -> " + result); } } **OUTPUT IS** Enter the value of number 1 1111111111111111111111111111111111111111111111111 Enter the value of number 2 2222222222222222222222222222222222222222222222222 Sum is Two numbers : -> 3333333333333333333333333333333333333333333333333 

import java.math.BigInteger将允许你处理任何大小的数字,