算法题记录2-大数相加、相乘

lc415-大数相加

class Solution {
    public String addStrings(String num1, String num2) {
        StringBuilder sb=new StringBuilder();
        char[] c1=num1.toCharArray();
        char[] c2=num2.toCharArray();
        int i=num1.length()-1;
        int j=num2.length()-1;
        int carry=0;
        while(i>=0||j>=0||a!=0){
           int m=i>=0?c1[i]-'0':0;
           int n=j>=0?c2[j]-'0':0;
           int result=m+n+carry;
           sb.append(result%10);
           carry=result/10;
           i--;j--;
        }
        return sb.reverse().toString();
    }
}

lc 大数相乘

利用了大数相加,很多细节需要注意:计算的时候从后往前,要在最开始加0;即使j超出位数了,进位的数不一定为0,所以要做一个判断

class Solution {
    public String multiply(String num1, String num2) {
        if(num1.equals("0")||num2.equals("0")) return "0";
        char[] c1=num1.toCharArray();
        char[] c2=num2.toCharArray();
        int m=num1.length()-1;
        int n=num2.length()-1;
        int a=0;
        String res="0";
        for(int i=m;i>=0;i--){
            StringBuilder sb=new StringBuilder();
            int k=m-i;
            while(k>0){
                sb.append(0);
                k--;
            }
            for(int j=n;j>=0||a!=0;j--){
                int n1=c1[i]-'0';
                int n2=j>=0?c2[j]-'0':0;
                int ans=n1*n2+a;
                sb.append(ans%10);
                a=ans/10;
            }
        res=add(res,sb.reverse().toString());
        }
        return res;
    }
    String add(String n1,String n2){
        char[] c1=n1.toCharArray();
        char[] c2=n2.toCharArray();
        int i=n1.length()-1;
        int j=n2.length()-1;
        int a=0;
        StringBuilder sb=new StringBuilder();
        while(i>=0||j>=0||a!=0){
            int m=i>=0?c1[i]-'0':0;
            int n=j>=0?c2[j]-'0':0;
            int b=m+n+a;
            sb.append(b%10);
            a=b/10;
            i--;j--;
        }
        return sb.reverse().toString();
    }
}

lc2-两数相加(链表)

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //定义一个新链表伪指针,用来指向头指针,返回结果
        ListNode prev = new ListNode(0);
        //定义一个可移动的指针,用来指向存储两个数之和的位置
        ListNode cur = prev;
        int carry = 0;
        while(l1 != null||l2 != null){
            int n1 = l1==null?0:l1.val;
            int n2 = l2==null?0:l2.val; 
            int sum = n1 + n2 + carry;
            carry = sum / 10;
            sum = sum % 10;
            //创建个新节点,将值赋给节点
            cur.next = new ListNode(sum);
            //将链表的节点后移
            cur = cur.next;
            if(l1 != null) l1 = l1.next;
            if(l2 != null) l2 = l2.next;
        }
        //如果最后两个数相加还有进位,需要建新的节点
        if(carry == 1) cur.next = new ListNode(carry); 
    return prev.next;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值