两个超级大数相加,在JAVA中可以用BigDecimal实现(BigDecimal类型数据对位数不做限制,理论上可以任意大),也可以通过数组来实现。
BigDecimal能承受多大数,我没有做过验证,但是数组的方式肯定是没有限制的。
BigDecimal实现比较简单:
BigDecimal bd1=new BigDecimal("99999999999999999999943567899999999999");
BigDecimal bd2=new BigDecimal("987654321");
System.out.println(bd1.add(bd2));
结果:
99999999999999999999943567900987654320
数组实现:
package test;
public class BigNumAddTest {
public static void main(String[] args) {
String data1 = "99999999999999999999943567899999999999";
String data2 = "987654321";
String result = add(data1, data2);
System.out.println(result);
}
public static String add(String s1, String s2) {
StringBuilder sb= new StringBuilder();
int temp=0;//存放进位
int tr=0;//存放两个数相加之和(最大18)
char[] c1=s1.toCharArray();
char[] c2=s2.toCharArray();
for(int i=c1.length-1, j=c2.length-1;i>=0 || j>=0;i--,j--){
if(i<0){
tr=Integer.valueOf(c2[j]+"")+temp;
}else if(j<0){
tr=Integer.valueOf(c1[i]+"")+temp;
}else{
tr=Integer.valueOf(c1[i]+"")+Integer.valueOf(c2[j]+"")+temp;
}
sb.append(tr%10);
temp=tr/10;
//System.out.println("i="+i+"j="+j+"sb="+sb);
}
if(temp!=0)
sb.append(temp);
return sb.reverse().toString();
}
}
结果:
99999999999999999999943567900987654320
从上面测试中发现至少这么大的数,二者的结果还是一致的。
另外说一句,BigDecimal 的构造方法要用字符串做参数,用数值做参数有问题。
分享到:
相关推荐
字符串实现大数相加,首先两个数是用计算机的位数不能表示出来的,然后我们用字符数组进行操作!
采用单链表的做的,以一万分界点,每个节点有四位数
C++实现大数加减乘数
该资源是用C语言编写两个超过100位的大数相加
分享一下用C/C++实现的大数相加和大数相乘,可以拿来当工具用。
该文件为C/C++课程对于大数相加问题的解决, /*大数相加*/ /*在一般语言中对整型数都有个最大限制, 先给出两个超出正常范围的十进制数 对其进行求和,带进位的加法*/
用c++编写的大数相加,可以实现任意两个长度的大数相加求和。
java实现大数相加,在不使用BigInteger工具的前提下实现大数相加
很通用的大数相加模版, 使用做ACM超出数范围情况下使用
大数相乘算法,java代码,包含独立大数相加算法 其中bigNumberPlus(String s1,String s2)为大数相加方法 bigNumberMultiply(String s1,String s2)为大数相乘方法
使用string类型实现大数...先将两个加数存为String类型,再从两个加数的末尾开始,一个数一个数的相加,跟做普通加法一个原理,只是这里需要注意的是,两个加数的类型为字符串,需要相应的转换才能相加,在代码有描述。
用C语言和链表编写的大数相加程序,想学链表的不要错过,程序里的不足请多指教
大数相加的算法,很不错,是用字符串的方法
C++实现的大数相加,有很好的类的封装性
大数相乘大数相加大数阶乘代码 完全解决代码简易 容易理解 有什么缺点欢迎评论 交流
js代码-两个大数相加
用面向对象及链表编写的C++大数相加、减源代码
描述一种大数相加的算法,简单清晰。 使用string 作为主要操作对象。 欧拉13题。
一个关于大数相乘和大数相加的c语言源代码