前言:
如今看官们对“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 大数计算