两个 大数求和

分析如下:
大数加法
用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;
}
}

浙公网安备 33010602011771号