`

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

 
阅读更多
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();
	}
}

0
1
分享到:
评论
6 楼 neyshule 2012-06-14  
sorry, miss type it, should be another question.
5 楼 neyshule 2012-06-14  
第一种解法扩号不对称啊,是内部类吗?
4 楼 bylijinnan 2012-04-13  
dolphin_lzy 写道
很好啊,支持你!

3 楼 dolphin_lzy 2012-04-13  
很好啊,支持你!
2 楼 bylijinnan 2012-03-27  
ershen290 写道
看了你的程序写的不错   支持你  我会常来的

谢谢,欢迎
1 楼 ershen290 2012-03-27  
看了你的程序写的不错   支持你  我会常来的

相关推荐

    大数加减,两个有几十位的数字相加想减

    对于两个大数 `a` 和 `b`,我们可以创建一个与 `a` 和 `b` 长度相同的数组来存储每一位,然后从最低位开始逐位相加,并处理进位。 以下是一个简单的算法描述: 1. 初始化两个大数 `a` 和 `b` 为字符串形式,按位...

    java大数(以数组形式保存整数,实现整数加减)

    两个大数相加时,可以类似小学的竖式加法,逐位相加并考虑进位。这里需要遍历两个数组,从低位到高位进行加法运算: 1. 初始化一个新的数组用于存放结果。 2. 初始化进位值为0。 3. 遍历两个数组,对于对应位上的...

    java练习_大数运算_BigInteger.pdf

    * 数学运算:BigInteger类可以用于实现各种数学运算,如大数相加、减、乘、除等。 * 数据处理:BigInteger类可以用于处理大型数据,如数字识别、数据分析等。 BigInteger类是Java中的一种非常有用的大数运算类,它...

    大数运算数据结构

    在大数比较中,`COMPARE_BIG_NUM`函数比较两个大数的大小。它从最低位开始逐位比较,如果在某一位上找到不相等的数字,就返回相应的标志(1表示第一个大数更大,0表示第二个大数更大)。如果所有位都相等,那么两个...

    大数的加减乘幂运算……

    例如,如果两个大数是“1234”和“5678”,我们可以将其转换为数组形式[1, 2, 3, 4]和[5, 6, 7, 8],然后逐位相加,注意进位。 减法与加法类似,只是需要处理借位。在大数减法中,如果高位的被减数小于减数,就需要...

    大数运算器 可做逆运算

    1. **加法**:对两个大数进行相加,确保结果能正确处理进位,以避免溢出问题。 2. **减法**:类似地,进行大数的减法运算,需要注意负数的表示以及借位的处理。 3. **乘法**:大数乘法通常使用Karatsuba算法或更...

    Java阶乘求和计算范例.rar

    在实际应用中,可能需要考虑性能优化,因为上述递归实现对于大数可能会导致栈溢出。可以改用循环实现阶乘计算,以减少递归调用: ```java public static long iterativeFactorial(int n) { long result = 1; for ...

    大数(含小数)的四则运算

    一种方法是将小数部分作为另一个大数处理,另一种是使用定点数表示,即在固定位置上表示小数点。对于乘除法,还需要考虑指数的调整。 ### 效率优化 为了提高大数运算的效率,可以使用以下策略: 1. 基于位的运算:...

    大数运算(加减乘,无小数)

    遍历两个大数的每一位,从低位到高位逐位相加。如果某一位的和超过9,我们需要进位。这个过程与我们手工做加法时的做法完全一致。为了防止溢出,我们需要记录进位并将其添加到下一位的和中。如果其中一个大数比另一...

    任意大的两数相加,输出其和

    在本题中,我们要实现的功能是从键盘接收两个任意大小的整数,然后计算并输出它们的和。这个任务涉及到的主要知识点包括大整数表示、输入输出处理、以及大整数的加法算法。 首先,我们需要理解如何在计算机中表示大...

    大数乘法、除法、加法、减法、以及求平方根源代码

    1. **大数乘法**:在计算机科学中,当两个大数相乘时,不能直接使用内置的乘法操作符。常见的算法有Karatsuba算法、Toom–Cook算法和快速傅里叶变换(FFT)。大数乘法通常通过将每个数字分解为更小的部分,然后对这些...

    Java编写的大整数四则运算

    首先判断两个数字的符号是否相同,如果相同,则将两数的绝对值相加;如果不同,则计算较大绝对值与较小绝对值之差,并赋予正确符号。 4. **减法方法**:`sub`方法用于大整数的减法,逻辑类似于加法,但关注于两数...

    大数计算器

    1. **加法 (a + b)**:这是最基本的数学运算,在大数计算中,由于数字可能超过常规整型或浮点型数据类型的范围,因此需要特殊的算法来处理两个大数的相加。通常,我们会用到进位加法的概念,确保每一位正确地进行...

    big-number-qestion.rar_Big!_qestion可数吗

    例如,两个大数相加需要逐位进行,处理进位问题。优化算法可以显著提高大数运算的效率。 3. **内存占用**:大数的表示通常需要更多内存,尤其是在处理非常大的数时。因此,处理大数时需要考虑内存管理,避免因数据...

    Java面试题大全

    例如,两个最大的`int`值相加会得到一个负数,这是由于溢出造成的。因此,要实现一个能处理百亿级别计算的计算器,我们需要自定义一个类,比如`BigInteger`,它能存储和操作大整数。 `BigInteger`类通常会有以下...

    简易计算器Java实训报告(实用应用文).doc

    3. 乘法:使用`*`运算符进行乘法计算,注意处理溢出问题,尤其是当两个大数相乘时。 4. 除法:除法运算需要注意除数不能为零的情况,否则会抛出`ArithmeticException`。因此,需要在执行除法操作前进行条件检查。 ...

    java面试宝典2011版

    6. **short类型的加法**:在Java中,将`short`与整型常量相加可能导致数据溢出,需要强制转换。例如,`s1 = (short)(s1 + 1);`。对于`s1 += 1;`,编译器会自动处理类型提升,所以不会报错。 7. **char类型的中文...

    java面试宝典2010版

    11. **"=="与equals方法**:"=="比较的是两个变量的引用,而equals方法(默认来自Object类)比较的是对象的内容。重写equals方法可以实现自定义对象的深度比较。 12. **静态变量与实例变量**:静态变量属于类,由类...

    Java面试宝典2010版

    7. **char存储中文字符**:char变量可以存储单个Unicode字符,包括中文汉字,因为一个中文汉字通常占两个字节。 8. **2乘以8的计算**:最有效率的方法是直接使用`2 ,这是左移运算符,相当于乘以2的3次方。 9. **...

Global site tag (gtag.js) - Google Analytics