`
lastsoul
  • 浏览: 33426 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

两个超级大数相加【原】

 
阅读更多
两个超级大数相加,在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 的构造方法要用字符串做参数,用数值做参数有问题。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics