龙空技术网

java实现两个超大大数的相加

万物生的好物 235

前言:

如今看官们对“java 大数计算”可能比较珍视,小伙伴们都想要分析一些“java 大数计算”的相关资讯。那么小编在网络上收集了一些有关“java 大数计算””的相关内容,希望看官们能喜欢,大家快快来学习一下吧!

java实现两个大数的相加

java的long取值范围是 -2^63 ~ 2^63-1

即:-9223372036854775808 ~ 9223372036854775807 ;

当使用一个大于9223372036854775807时,相加时将抛出异常,

如我们使用对123456789123456789123456789和123相加,

System.out.println(Long.valueOf(a)+Long.valueOf(b));

抛出异常

所以直接转换为long相加是不可行的,我们可以模拟我们手动做加法的过程,

即从两个字符串的最右端开始对齐相加,就像小学生做加法一样,处理进位操作,从而得到一个我们想要的结果,这里我们使用堆栈来保存相加的结果,即10的余数,用一个变量来存储当前位相加得到的进位

代码如下:

import java.util.Stack;/** * 输入任意两个数字字符串,输出相加 * @author ssj * */public class LargeNumAdd {	public static void main(String[] args) {		String a="123456789123456789123456789";////大于long的最大值		String b="123";				//System.out.println(Long.valueOf(a)+Long.valueOf(b));				System.out.println("字符串处理相加的结果:");		System.out.println(a+"+"+b+"  =  "+add(a,b));	}	/**	 * 大数相加	 * @param num1	 * @param num2	 * @return	 */	public static String add(String num1,String num2) {		//一位一位对齐相加即可		Stack<Integer> stk=new Stack<>();		int subAdd=0;		int i=num1.length()>num2.length()?num2.length():num1.length();		int k=1;		while(k<=i) {			//先从两个字符串的右边开始对齐相加,右边即为低位开始			int n1 = Integer.parseInt(num1.charAt(num1.length()-k)+"");			int n2 = Integer.parseInt(num2.charAt(num2.length()-k)+"");			int s=n1+n2+subAdd;//两个位相加,并且加上前一位相加的进位			int md = s%10;//相加之和取10的余数,保留在本位			subAdd=s/10;//10的倍数则为下一位的进位			stk.add(md);			k++;		}		String temp=num1.length()>num2.length()?num1:num2;		i=Math.abs(num1.length()-num2.length());		i--;		//更长的字符串,所表示数字肯定越大,需要继续加进位		while(i>=0) {			int n1 = Integer.parseInt(temp.charAt(i)+"");			int s=n1+subAdd;			int md = s%10;			subAdd=s/10;			stk.add(md);			i--;		}		//最高位如果有进位也要加		if(subAdd>0) {			stk.add(subAdd);		}		StringBuffer sb=new StringBuffer();		//数据全部出栈,生成结果字符串		while(!stk.isEmpty()) {			sb.append(stk.pop());		}				return sb.toString();	}	}

运行结果:

标签: #java 大数计算