LeetCode415字符串相加(大数相加),大数相乘

题目:

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。

注意:

num1 和num2 的长度都小于 5100.
num1 和num2 都只包含数字 0-9.
num1 和num2 都不包含任何前导零。
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。

思路:

可以通过手工来模拟加法的过程,参考https://leetcode-cn.com/problems/add-strings/solution/add-strings-shuang-zhi-zhen-fa-by-jyd/

用i,j二个指针指向所给字符串的末尾指向的数,然后向前遍历,并且将进位carray赋初始值0,进行的过程如下:

  1. 取二个字符串尾部的数,转成int型,(通过num.charAt(i)-'0'来实现),取的时候回出现二个字符串的长度不一样,也就是可能一个字符串能取到数,另一个取不到数,这时用0来填充,即int n1=i>=0 ?num1.charAt(i)-'0':0;
                int n2=j>=0 ?num2.charAt(j)-'0' :0;
  2. 相加得到结果,res(指的二个字符串尾部的数n1,n2,再加上进位carray)
  3. 更新进位carry
  4. 将真正进位数用StringBuilder接收,(sb.append(res%10))
  5. 更新i,j的值,使它们都从后往前运动,
  6. 将最后的进位carray,添加到字符串缓冲区
  7. 反转就是所要的结果。
public String addStrings(String num1, String num2) {
        if(num1==null||num2==null){
            return num1==null ?num2:num1;
        }
        StringBuilder sb=new StringBuilder("");
        int carray=0;
        int i=num1.length()-1,j=num2.length()-1;
        while(i>=0||j>=0){
            int n1=i>=0 ?num1.charAt(i)-'0':0;
            int n2=j>=0 ?num2.charAt(j)-'0' :0;
            int temp=n1+n2+carray;
            
            //计算进位
            carray=temp/10;
            //将进位后的数添加到缓冲区中
            sb.append(temp%10);
            i--;
            j--;
        }
        if(carray==1){
            sb.append(1);
        }
        return sb.reverse().toString();
    }
}

大数相乘:

public String multiply(String num1, String num2) {
        if(num1.equals("0")||num2.equals("0")){
            return "0";
        }
        String res="0";
        //将num2的每一个数与num1相乘
        for(int i=num2.length()-1;i>=0;i--){
            //进位
            int carray=0;
            
            //保存num2与num1相乘的结果
            StringBuilder temp=new StringBuilder();
            //补0
            for(int j=0;j<num2.length()-1-i;j++){
               temp.append(0);
            }
            int n2=i<0 ?0 :num2.charAt(i)-'0';
            //num2与num1的每一位相乘
            for(int j=num1.length()-1;j>=0||carray!=0;j--){
                int n1=j<0 ?0:num1.charAt(j)-'0';
                int product=(n1*n2+carray)%10;
                temp.append(product);
                //更新进位
                carray=(n1*n2+carray)/10;
            }
            res=addString(res,temp.reverse().toString());
        }
        return res;
    }
    public String addString (String num1,String num2){
        StringBuilder temp=new StringBuilder();
        int carray=0;
        for(int i=num1.length()-1,j=num2.length()-1;i>=0||j>=0||carray!=0;i--,j--){
            
            int n1=i<0? 0:num1.charAt(i)-'0' ;
            int n2=j<0? 0:num2.charAt(j)-'0';
            
            //
            int sum=(n1+n2+carray)%10;
            temp.append(sum);
            carray=(n1+n2+carray)/10;
        }
        return temp.reverse().toString();
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值