两个大数相加的三种实现方法

简介: 两个大数相加的三种实现方法
import java.math.BigDecimal;
/**
 * 两个大数相加
 *
 * @author 
 * @version $Id: BigNumberAdd.java, v 0.1 2014年8月18日 下午2:13:20 
 */
public class BigNumberAdd1 {
    public static void main(String[] args) {
        String num1 = "34646313135453431";
        String num2 = "999999999121111";
        int len1 = num1.length();
        int len2 = num2.length();
        if(len1 > len2){
            for(int i=0; i<len1 - len2; i++){
                num2 = "0" + num2;
            }
        } else if (len1 < len2){
            for(int i=0; i<len2-len1; i++){
                num1 = "0" + num1;
            }
        }
        int[] arr1 = str2intArr(num1);
        int[] arr2 = str2intArr(num2);
        arr1 = reverse(arr1);
        arr2 = reverse(arr2);
        int[] result = add(arr1, arr2);
        for(int i=result.length-1; i>=0; i--){
            if(i == result.length-1 && result[i] == 0) continue;
            System.out.print(result[i]);
        }
        System.out.println();
        System.out.println("****************以下为对照结果******************");
        BigDecimal b1 = new BigDecimal(num1);
        BigDecimal b2 = new BigDecimal(num2);
        BigDecimal b3 = b1.add(b2);
        System.out.println(b3);
    }
    /**
     * 核心方法   两个整型数组相加 
     *
     * @param a
     * @param b
     * @return
     */
    public static int[] add(int[] a,int[] b){
        int maxlen = a.length;
        int[] sum = new int[maxlen + 1];
        for(int i=0; i<maxlen; i++){
            int tempSum = a[i] + b[i];
            sum[i] += tempSum % 10;
            int d = tempSum / 10; // 进位
            sum[i+1] += d;
        }
        return sum;
    }
    /**
     * 将字符串转换成整型数组
     *
     * @param str
     * @return
     */
    public static int[] str2intArr(String str){
        int len = str.length();
        int[] arr = new int[len];
        for(int i=0; i<len; i++){
            arr[i]  = str.charAt(i) - '0';
        }
        return arr;
    }
    /**
     * 倒置数组元素
     *
     * @param arr
     * @return
     */
    public static int[] reverse(int[] arr){
        for(int i=0,j=arr.length-1;i<j; i++,j--){
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        return arr;
    }
    public static void print(int[]  arr){
        for(int i=0; i<arr.length; i++){
            System.out.print(arr[i]);
        }
        System.out.println();
    }
}



public class BigNumberAdd2 {
    public static void main(String[] args) {
        String str1 = "34646313135453431";
        String str2 = "999999999121111";
        int len1 = str1.length();
        int len2 = str2.length();
        if(len1 > len2){
            for(int i=0; i<len1-len2; i++){
                str2 = "0" + str2;
            }
        } else if(len1 < len2){
            for(int i=0; i<len2-len1; i++){
                str1 = "0" + str1;
            }
        }
        System.out.println(add(str1, str2));
    }
    public static String add(String str1, String str2){
        boolean flag = false;
        String result = "";
        for(int i=str1.length()-1; i>=0; i--){
            int a = str1.charAt(i) - '0';
            int b = str2.charAt(i) - '0';
            int sum = 0;
            if(flag){
                sum  = 1;
            } 
            sum += (a + b);
            if(sum / 10 > 0){
                flag = true;
            } else {
                flag = false;
            }
            result = sum % 10 + result;
        }
        return result;
    }
}
public class BigNumberAdd3 {
    public static void main(String[] args) {
        String num1 = "34646313135453431";
        String num2 = "999999999121111";
        int len1 = num1.length();
        int len2 = num2.length();
        if(len1 > len2){
            for(int i=0; i<len1 - len2; i++){
                num2 = "0" + num2;
            }
        } else if (len1 < len2){
            for(int i=0; i<len2-len1; i++){
                num1 = "0" + num1;
            }
        }
        int[] arr = new int[len1 + 1];
        for(int i=len1-1; i>=0; i--){
            int a = num1.charAt(i) - '0';
            int b = num2.charAt(i) - '0';
            arr[i+1] = a + b; 
        }
        for(int i=len1; i>0; i--){
            int temp = arr[i];
            arr[i] = temp % 10;
            arr[i-1] = arr[i-1] + temp / 10;
        }
        String result = toString(arr);
        if(result.charAt(0) == '0') {
            result = result.substring(1);
        }
        System.out.println(result);
    }
    public static String toString(int[] arr){
        StringBuilder sb = new StringBuilder();
        for(int i=0; i<arr.length; i++){
            sb.append(arr[i]);
        }
        return sb.toString();
    }
}


目录
相关文章
|
8月前
|
算法 测试技术 C#
【位运算】【脑筋急转弯】2749. 得到整数零需要执行的最少操作数
【位运算】【脑筋急转弯】2749. 得到整数零需要执行的最少操作数
|
算法 C语言
【C语言】判断一个数是否为素数(素数求解的N种境界)(下)
【C语言】判断一个数是否为素数(素数求解的N种境界)(下)
135 0
|
8月前
|
Java 测试技术 Python
每日一题《剑指offer》字符串篇之表示数值的字符串
每日一题《剑指offer》字符串篇之表示数值的字符串
58 0
每日一题《剑指offer》字符串篇之表示数值的字符串
JAVA实现开根号的两种方式:二分法以及牛顿迭代法
JAVA实现开根号的两种方式:二分法以及牛顿迭代法
296 0
|
测试技术 C语言
【C语言】判断一个数是否为素数(素数求解的N种境界)(上)
【C语言】判断一个数是否为素数(素数求解的N种境界)
292 0
|
机器学习/深度学习 算法 NoSQL
【基础算法】浅浅刷个小题 # 反转字符串 # 反转字符串 II # 三个数的最大乘积 #
【基础算法】浅浅刷个小题 # 反转字符串 # 反转字符串 II # 三个数的最大乘积 #
|
算法 Python
转:最大公约数算法很无聊吗?一个轻松方法(辗转相除法)3行代码搞定
最大公约数算法不是很无聊,计算最大公约数是数学中一个重要的概念,可以用于判断两个数是否互质、求分数的约分等,在很多领域都有广泛的应用。辗转相除法3行代码搞定。
77 0
|
测试技术
每日一题——倒置字符串
将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I
115 0
AcWing 周赛12 3804. 构造字符串(贪心 构造)
AcWing 周赛12 3804. 构造字符串(贪心 构造)
82 0
|
算法 前端开发 程序员
「LeetCode」415-字符串相加⚡️
「LeetCode」415-字符串相加⚡️
114 0
「LeetCode」415-字符串相加⚡️