两个 大数求和

分析如下:

大数加法
用BigInteger是投机取巧的做法,面试时这么干会被面试官喷。这题考察的是大数计算器的思想,类似的题还有lc 2(链表两数相加)。只需要想象一下我们在做加法时,都做了什么事情,其实只有两种情况:需要进位和不需要进位。所谓进位,无非是当前位相加大于等于10的话,就在下一位加1。那么我们就可以用一个变量carry来表示是否有进位,有进位为1,无进位为0,于是在每一位计算时,所做的计算就是三个变量相加:

结果的此位 = 第一个数的此位 + 第二个数的此位 + carry;

//代码如下:

import java.util.*;

class Main{
    public static void main(String[] args) {
        Solution solution=new Solution();
        System.out.println(solution.solve("4000","321"));
    }
}
public class Solution {
    /**
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     */
    public String solve (String s, String t) {
        String longer=s,shorter=t;
        if(s.length()<t.length()){
            longer=t;
            shorter=s;
        }
        StringBuilder res=new StringBuilder();
        int i,j;
        int carry=0;
        for(i=shorter.length()-1,j=longer.length()-1;i>=0;i--,j--){
            int a=shorter.charAt(i)-'0';
            int b=longer.charAt(j)-'0';
            int cur=a+b+carry;
            if(cur>=10){
                cur%=10;
                carry=1;
            }else{
                carry=0;
            }
            res.insert(0,cur);
        }
        for(int x=j;j>=0;j--){
            int b=longer.charAt(j)-'0';
            int cur=b+carry;
            if(cur>=10){
                cur%=10;
                carry=1;
            }else{
                carry=0;
            }
            res.insert(0,cur);
        }
        if(carry!=0){
            res.insert(0,carry);
        }
        return res.toString();
    }
}

运行结果如下:

如果是链表的两个大数之和

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode preHead=new ListNode(-1);
        ListNode cur=preHead;
        int up=0;
        while(l1!=null || l2!=null || up!=0){//还有进位的时候还要继续进行循环
            int ans1=(l1!=null)?l1.val:0;
            int ans2=(l2!=null)?l2.val:0;
            if(l1!=null) l1=l1.next;
            if(l2!=null) l2=l2.next;
            int rest=(ans1+ans2+up)%10;//这里要加上up这个进位
            cur.next=new ListNode(rest);//不断地建立新的结点来存储好计算好的值
            cur=cur.next;
            up=(ans1+ans2+up)/10;//这里也要加上up这个进位
        }
        return preHead.next;
    }
}

posted @ 2022-04-20 14:12  ArtiaDeng  阅读(211)  评论(0)    收藏  举报