两个大整数相加 Java实现

本文分析和实现了两个大整数相加的思路和做法

1.首先,由于计算机表示的整数范围有限,当加数的位数超过计算机所能表示的范围时就需要用到这里的算法。由于整数过大,不能一次完成相加,我们猜想能否将两个整数存储到数组中,然后逐位相加。当然,这里实现的方法就是基于此。代码如下

public class bigIntegerSum {
    //两个大整数相加,这里将两个整数分别存储到数组中,即拆分成一位进行相加,也可以将大整数拆分成9位(int类型最多至此10位,防止溢出,分成9位)
    private String integer1;
    private String integer2;
    private int[] array1;         //储存整数1
    private int[] array2;         //储存整数2
    private int[] result;         //储存结果
    public bigIntegerSum(String integer1,String integer2){
        this.integer1=integer1;
        this.integer2=integer2;
    }
    public String getSum(){     //计算两个大整数的和并返回
        int maxLength=integer1.length()>=integer2.length()?integer1.length():integer2.length();
        array1=new int[maxLength+1];    //对齐
        array2=new int[maxLength+1];
        result=new int[maxLength+1];    //结果数组的长度要比较大的整数长度大一
        for(int i=0;i<integer1.length();i++){
            array1[i]=integer1.charAt(integer1.length()-1-i)-'0';    //将整数倒叙储存到数组中
        }
        for(int i=0;i<integer2.length();i++){
            array2[i]=integer2.charAt(integer2.length()-1-i)-'0';    //将整数倒叙储存到数组中
        }
        for(int i=0;i<maxLength;i++){
            int tem=array1[i]+array2[i]+result[i];
            if(tem>=10) {               //有进位的时候,将进位存到结果的下一位
                result[i + 1] = 1;
                result[i]=tem-10;
            }else result[i]=tem;
        }
        StringBuilder value=new StringBuilder();
        int tag=0;
        for(int i=result.length-1;i>=0;i--){     //找到结果中第一个非0值得位置
            if(result[i]!=0){
                tag=i;
                break;
            }

        }
        for(int i=tag;i>=0;i--){                //将结果逆序存储
            value.append(result[i]);
        }
        String Sum=value.toString();
        return Sum;
    }
    public static void main(String[] args){
        bigIntegerSum bigIntegerSum=new bigIntegerSum("123","2984");
        String value=bigIntegerSum.getSum();
        System.out.print(value+"       "+value.length());
    }
}

2. 上述方法时间复杂度为O(n),其实可以继续优化。思路如下:上述方法中我们是把整数拆分成精度为1的数进行相加的,其实,计算机的表达能力很强大。int类型的数的范围是多少我就不写了,(懒得百度)位数是10位,为了防止溢出,我们可以把大整数分为9位的小整数,然后进行相加。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值