当前位置:首页 > 开发 > 编程语言 > Java > 正文

java实现两个大数相加,可能存在溢出。

发表于: 2012-03-25   作者:bylijinnan   来源:转载   浏览:
摘要: import java.math.BigInteger; import java.util.regex.Matcher; import java.util.regex.Pattern; public class BigIntegerAddition { /** * 题目:java实现两个大数相加,可能存在溢出。 * 如123456789 + 987654321
import java.math.BigInteger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class BigIntegerAddition {

	/**
	 * 题目:java实现两个大数相加,可能存在溢出。
	 * 如123456789 + 987654321 返回 1111111110
	 * 1.直接用BigInteger
	 * 2.模拟手算加法,进位相加(暂时没有考虑负数的情况)
	 */
	public static void main(String[] args) {

		String x="23456789";
		String y="987654321";
		//use BigInter
		BigInteger a=new BigInteger(x);
		BigInteger b=new BigInteger(y);
		BigInteger c=a.add(b);
		System.out.println(c.toString());
		//"reinvent the wheel"
		String d=add(x,y);
		System.out.println(d);
		
	}

	//return x+y. Have not considered the negative number yet.
	public static String add(String x,String y){
		if(x==null||y==null){
			return null;
		}
		if(!isNumeric(x)||!isNumeric(y)){
			return null;
		}
		if(x.equals("0")){
			return y;
		}
		if(y.equals("0")){
			return x;
		}
		
		if(x.length()>y.length()){
			String tmp=x;
			x=y;
			y=tmp;
		}
		
		x=addZeroToFirst(x,y.length());
		String z=addHelp(x,y);
		return z;
	}
	
	public static String addHelp(String x,String y){
		String z="";
		int len=x.length();
		int[] a=toIntArray(x);
		int[] b=toIntArray(y);
		int[] c=new int[len+1];
		int d=0;//to carry. No need to use int[]
		for(int i=0;i<len;i++){
			int tmpSum=a[len-1-i]+b[len-1-i]+d;
			c[len-i]=tmpSum%10;
			d=tmpSum/10;
		}
		c[0]=d;
		StringBuilder sb=new StringBuilder();
		for(int i=0;i<=len;i++){
			sb.append(c[i]);
		}
		if(c[0]==0){//delete the first '0' in result string
			z=sb.substring(1);
		}else{
			z=sb.toString();
		}
		return z;
	}
	

	//String - toCharArray - toIntArray
	public static int[] toIntArray(String str){
		int len=str.length();
		int[] result=new int[len];
		for(int i=0;i<len;i++){
			result[i]=str.charAt(i)-'0';
		}
		return result;
	}
	
	//("123",5)-->"00123"
	public static String addZeroToFirst(String str,int length){
		StringBuilder sb=new StringBuilder();
		int diff=length-str.length();
		while(diff>0){
			sb.append("0");
			diff--;
		}
		sb.append(str);
		return sb.toString();
	}
	
	public static boolean isNumeric(String str){
		Pattern p=Pattern.compile("[0-9]*");
		Matcher isNum=p.matcher(str);
		return isNum.matches();
	}
}

java实现两个大数相加,可能存在溢出。

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
/************************************************************************/ /* 大数加法 题目:
/* *程序的版权和版本声明部分: *Copyright(c)2014,烟台大学计算机学院学生 *All rights reserved
转自:http://www.th7.cn/Program/IOS/201211/113566.shtml 突然有人问你100!结果有几个零。其实这
今天下午尝试做了几道杭电的OJ题目。虽说题目不难,但不止一次被坑。多输出一个换行什么的都不行,
题目:   返回一个占内存较多的数组的最大子数组。 要求:   两人结对完成编程任务。   一人
一、背景知识 1、JVM体系结构 2、JVM运行时数据区 3、JVM内存模型 JVM运行时内存 = 共享内存区 + 线
一、背景知识 1、JVM体系结构 2、JVM运行时数据区 3、JVM内存模型 JVM运行时内存 = 共享内存区 + 线
我们都知道ArrayList类中有个重要的方法是Add(),该方法用于向集合中添加元素,它有一个object类型的
当提到计算一个数的阶乘时,也许很多人都能够轻易的解决,但很多人可能会发现,当计算100或200甚至
大数四则运算的C++实现 [摘要] 大数运算不仅仅运用在密码学中,还运用在一些物理学研究、生物学,化
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号