(数组)大数相乘,相加
- 题目一:大数相乘。
- 题目分析:两个大数相加,考虑到数据类型不能表示大数,所以用字符串直接处理两个数。两个数字,用一个数逐位的与另一个数相乘,将所得的乘积逐位相加(注意进位的情况)。最后得到的就是所要的数字。因为m位的数乘以n位的数,最多得到m+n的位数,所以用m+n的数组存储最终结果。
这个是代码的计算过程图。 - 代码:
public String multiply(String num1, String num2) { int n1 = num1.length(); int n2 = num2.length(); StringBuilder sb = new StringBuilder(); int[] tmp = new int[n1+n2]; for(int i=n1-1;i>=0;i--){ for(int j=n2-1;j>=0;j--){ tmp[i+j+1] +=(num1.charAt(i)-'0')*(num2.charAt(j)-'0'); } } int carrybit=0;//从个位开始,carrybit是进位 for(int i=tmp.length-1;i>=0;i--){ tmp[i]+=carrybit; carrybit=tmp[i]/10; tmp[i]=tmp[i]%10; } int left=0; while(left<tmp.length-1&&tmp[left]==0) left++; for(;left<tmp.length;left++){ sb.append(tmp[left]); } return sb.toString(); }
- 题目二:大数相加
- 题目分析:利用字符串进行相加减。
- 代码:
class Solution { public: string addBinary(string a, string b) { int len_a = a.size()-1; int len_b = b.size()-1; int carry = 0; string sum; while (len_a >= 0 || len_b >= 0){ int flag = 0; if (len_a >= 0){ flag += a[len_a] - '0'; len_a--; } else flag += 0; if (len_b >= 0){ flag += b[len_b] - '0'; len_b--; } else flag += 0; flag += carry; carry = flag/2; sum = static_cast<char>(flag%2+'0') + sum; } if (carry == 1) sum = '1' + sum; return sum; } };