java实现两个大数相加

使用java的几种基本类型计算大数(比long类型的最大数还大)的时候,编译器就会报错:

我们知道,java的基本数据类型有8种,而整型有4种

数据类型 byte short int long
二进制长度 8 16 32 64
数的范围 [-27,27-1] [-215,215-1] [-231,2^31-1] [-263,263-1]
最小数 -128 -32768 -2147483648 -9223372036854775808
最大数 127 32767 2147483647 9223372036854775807

那么怎么计算两大数相加呢?

思路如下: 先确定个位数>再确定十位数>再确定百位数>…

用923+78举例列举步骤:

1.因为加法规则是个位加个位,十位加十位,所以采用倒序遍历923,78

2.先拿8+3=11。发现进位了,11%10=1,确定结果个位一定是1,此时储存进位的1

3.再拿(2+7)+1=10。发现进位了,10%10=0,可以确定十位一定0,此时储存进位的1

4.再拿(9+0)+1=10。发现进位了,10%10=0,可以确定百位一定是0,此时储存进位的1

5.这个时候遍历已经完了,但是发现拼接结果百十个位依次是001对不对,别忘了第四步还有个进位1

6.拼接最后的结果1。得到最终结果是: 1001

代码片如下:

  public static String add1(String num1, String num2) {
     
        StringBuffer sb = new StringBuffer();
      	//进位的数,一般为1
        int calculationResults = 0;
      
     	//反转字符串
        num1 = (new StringBuffer(num1)).reverse().toString();
        num2 = (new StringBuffer(num2)).reverse().toString();
      
      	//获得遍历最大轮数
        int loopNum=Math.max(num1.length(),num2.length());
        for (int i = 0; i < loopNum; i++) {
     
            
            //每次遍历的数,超过轮数补0
            int nodeNumOne = i > num1.length() - 1 ? 0 : Integer.parseInt(num1.charAt(i) + "");
            int nodeNumTwo = i > num2.length() - 1 ? 0 : Integer.parseInt(num2.charAt(i) + "");
            int res = nodeNumOne + nodeNumTwo + calculationResults;
            calculationResults = res / 10;
            int sonNum = res % 10;
            sb.append(sonNum);
        }
        if (calculationResults != 0) {
     
            sb.append(calculationResults);
        }
        return sb.reverse().toString();
    }

你可能感兴趣的:(算法,算法)