大数之和与大数之积
大数之和
题目:以字符串形式读入俩个数字,编写一个函数计算它们的和,再以字符串形式返回。不可以使用有关BigInteger之类的包。
解析:可以借助StringBuilder从后往前对逐个位置处理。用temp变量保留是否有进位。由于StringBuilder是采用追加的形式进行字符的添加,所以最后要进行反转处理。
代码如下:
public String solve (String s, String t) {
// write code here
StringBuilder sb = new StringBuilder();
int i = s.length()-1;
int j = t.length()-1;
int temp = 0; //进1位,满10进1
while(i >= 0 || j >= 0 || temp != 0){
temp += i >= 0 ? s.charAt(i--) - '0' : 0;
temp += j >= 0 ? t.charAt(j--) - '0' : 0;
sb.append(temp % 10);
temp = temp / 10;
}
return sb.reverse().toString();
}
两数相加(大数之和的链表版)
题目:leetcode-两数相加
解析:我们可以用栈保留每个位置的值,最好再形成一个完整的链表。代码如下:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
Deque<Integer> deque = new LinkedList();
int temp = 0;
while(l1 != null || l2 != null || temp != 0){
int a = l1 == null? 0 : l1.val;
int b = l2 == null? 0 : l2.val;
int c = a+b+temp;
temp = c > 9 ? 1 : 0;
deque.addFirst(c % 10);
l1 = l1 == null ? l1 : l1.next;
l2 = l2 == null ? l2 : l2.next;
}
ListNode head = new ListNode(deque.removeLast());
ListNode node = head;
while(!deque.isEmpty()){
int num = deque.removeLast();
node.next = new ListNode(num);
node = node.next;
}
return head;
}
大数之积 (进阶版)
题目:以字符串形式读入俩个数字,编写一个函数计算它们的积,再以字符串形式返回。不能使用BigInteger相关的类。
解析:与上面的大数之和是同一类型的题目。假设是计算num1 * num2,可以将num1每个位置上的数字与num2的一个位置相乘,再把每一轮得到的结果用上大数之和算法加起来。代码如下:
public String multiply(String num1, String num2) {
if("0".equals(num1) || "0".equals(num2)){
return "0";
}
int n = num1.length();
int m = num2.length();
String ans = "0";
for(int i = n-1 ; i >= 0 ; i--){
StringBuffer sb = new StringBuffer();
int add = 0;
int a = num1.charAt(i) - '0';
for(int j = n-1 ; j > i ; j--){
sb.append(0);
}
for(int k = m-1 ; k >= 0 ; k--){
int b = num2.charAt(k)-'0';
int temp = a*b + add;
sb.append(temp % 10);
add = temp / 10;
}
if(add != 0){
sb.append(add);
}
ans = solve(ans,sb.reverse().toString());
}
return ans;
}
//大数之和
public String solve (String s, String t) {
// write code here
StringBuilder sb = new StringBuilder();
int i = s.length()-1;
int j = t.length()-1;
int temp = 0; //进1位,满10进1
while(i >= 0 || j >= 0 || temp != 0){
temp += i >= 0 ? s.charAt(i--) - '0' : 0;
temp += j >= 0 ? t.charAt(j--) - '0' : 0;
sb.append(temp % 10);
temp = temp / 10;
}
return sb.reverse().toString();
}