`
longfor5
  • 浏览: 51154 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

 
阅读更多

方法一:

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();
    }
}

 

分享到:
评论

相关推荐

    两个大数相加-字符串实现

    本主题将深入探讨如何通过字符串实现大数相加,这是一种常见的大数处理方法。 一、大数相加的背景与需求 在日常编程中,我们通常使用诸如int、long等基本数据类型来存储和操作数字。然而,当需要处理的数字非常大...

    C++大数相加减

    2. 检查两个大数的长度,如果长度不同,将较短的数在其前面补零,以确保它们具有相同的长度。 3. 遍历两个字符串,从低位到高位逐位相加,同时考虑当前位和上一位的进位。 4. 如果在某一位上相加后结果超过9,需要...

    用C语言编写两个大数相加

    - 初始化:创建两个数组分别存储两个大数,以及一个数组用于存储结果。 - 搭配进位:从低位到高位,逐位进行加法运算,同时考虑当前位的进位。对于每一位,我们只需处理两个数组对应位置的元素加上上一位的进位值...

    大数运算 大数相加 大数相乘

    2. 检查两个大数的长度,如果一个数的位数多于另一个,可以添加前导零以保持长度一致。 3. 遍历两个数组,从低位到高位,对对应位进行相加,同时考虑进位。 4. 如果有进位,将其加到下一位的和中。 5. 最后,检查...

    两个大数相加的运行程序

    采用单链表的做的,以一万分界点,每个节点有四位数

    c++实现大数相加

    C++实现大数相加 C++作为一门功能强大且灵活的编程语言,在实现大数相加时提供了多种方法。下面我们将探讨使用C++实现大数相加的方法。...使用C++实现大数相加是一种非常实用的方法,可以满足各种计算需求。

    大数相加通用模版

    该方法将两个大数(以字符串形式存储)作为输入参数,返回它们的和(同样以字符串形式)。首先,它会判断两个数哪个更长,并将较短的数附加到较长数的末尾,然后逐位进行加法运算。在每一步中,如果当前位的和超过9...

    C++实现大数相加

    总的来说,使用`std::string`实现大数相加是一种直观且易于理解的方法,尤其在不依赖特定的大数库的情况下。然而,在实际应用中,为了获得更好的性能和更完善的功能,可能会选择使用如GMP(GNU Multiple Precision ...

    用c++编写的大数相加

    用c++编写的大数相加,可以实现任意两个长度的大数相加求和。

    数据结构课设一:链表实现大数相加

    5. 最后,结果链表就代表了两个大数的和,可以以适当的形式输出,如转化为字符串。 在这个VS2017项目中,`mytest1.sln`是解决方案文件,包含了整个项目的配置信息。`.vs`文件夹是Visual Studio的工作区文件,包含了...

    实现大数相加功能

    3. **比较大数**:在相加前,可能需要比较两个大数的大小,以便确定相加时的高位。可以从前向后逐位比较,直到找到不同的位或者到达数组末尾。 4. **大数相加**:这是一个关键步骤,可以采用类似于小学数学中的竖式...

    大数相乘大数相加大数阶乘代码

    这里我们关注的焦点是大数相乘、大数相加以及大数阶乘的算法实现,这些都是计算密集型任务,尤其是在处理极端数值时。下面将详细介绍这三个知识点,并提供一个使用C++实现的示例。 1. **大数相乘**: 大数相乘通常...

    大数相加.cpp

    该文件为C/C++课程对于大数相加问题的解决, /*大数相加*/ /*在一般语言中对整型数都有个最大限制, 先给出两个超出正常范围的十进制数 对其进行求和,带进位的加法*/

    MFC实现大数相加 C++

    在实现大数相加功能时,首先考虑如何比较两个大数的大小,以便确定在哪个数字的末尾添加进位。可以编写一个`compare`函数,比较两个`BigInt`对象的字符串表示。如果第一个字符串在任何位置上都小于第二个字符串,...

    利用链表实现大数相加

    总结,通过链表实现大数相加是一种常见的算法思路,它利用链表的动态扩展性和顺序访问特性,可以方便地处理任意长度的大整数相加。在C#中,我们可以通过定义链表节点类和链表类,以及编写相应的操作方法来实现这个...

    C++ 两个大数相加.7z

    在给定的"两个大数相加"的场景中,我们可以预期包含的代码将演示如何实现这个功能。下面我们将深入探讨相关的C++知识点。 首先,我们要理解C++的标准库并不直接支持大数运算。因此,我们需要自己设计一个数据结构来...

    用栈实现了大数相加(C++)

    3. **初始化栈**:创建两个栈,分别存储两个大数的每一位。由于栈是后进先出的数据结构,我们从低位到高位将大数的每一位压入栈中。 4. **进行加法运算**: - 初始化一个临时变量`carry`(进位)为0。 - 当两个栈...

    大数相加jar包(一个简单算法的实现)

    描述中提到的“Java语言实现的大数相加程序”,意味着这个程序采用了特定的算法来处理两个大数的加法。简单算法可能是指逐位相加,类似于我们手工计算的方式,即从低位到高位,每两位进行相加,如有进位则向上一位...

    js代码-两个大数相加

    在给定的`js代码-两个大数相加`主题中,我们可以探讨两种主要的方式来实现大数相加: 1. 字符串处理: 由于JavaScript的字符串可以无限长度,我们可以通过将大数转换为字符串,然后逐位相加来实现大数的加法。具体...

    C++大数相加

    C++实现的大数相加,有很好的类的封装性

Global site tag (gtag.js) - Google Analytics