题意:两个大位数的乘法(用String实现)
思路:很简单,模拟人的乘法即可。这道题印象很深刻,因为我小学最初学编程,学到最后就是这个题。但是我当时太不踏实了,就没静下心来学。等到本科想编这道题,发现能力水平不够,心不够静。等到研究生编这道题的时候,越来越快,今天连写代码加调试到最后正确也就是35分钟的时间。题并不难,对于我来说,是一道很有纪念意义的题。Medium还有23题,加油~
public class Solution {
public String multiply(String num1, String num2) {
StringBuffer ans = new StringBuffer();
ArrayList<StringBuffer> tempResult = new ArrayList<>();
ArrayList<StringBuffer> num1Result = new ArrayList<>();
int i, j, maxLength = 0;
int jinwei, tempSum;
// calculate num1*0...num1*9
for (i = 0; i <= 9; i++) {
StringBuffer temp = new StringBuffer();
jinwei = tempSum = 0;
for (j = num1.length() - 1; j >= 0; j--) {
tempSum = jinwei + (num1.charAt(j) - '0') * i;
jinwei = tempSum / 10;
temp.append(tempSum % 10);
}
if(jinwei!=0) temp.append(jinwei);
num1Result.add(temp);
}
// calculate num1*num2 by bits;
for (i = num2.length() - 1; i >= 0; i--) {
StringBuffer t = num1Result.get(num2.charAt(i) - '0');
StringBuffer zeros = new StringBuffer();
for (j = 0; j < num2.length() - 1 - i; j++)
zeros.append("0");
zeros.append(t);
maxLength = Math.max(maxLength, zeros.length());
tempResult.add(zeros);
}
// add all result
jinwei = tempSum = 0;
for (i = 0; i < maxLength; i++) {
tempSum=0;
for (j = 0; j < num2.length(); j++) {
if (i < tempResult.get(j).length()) {
tempSum = tempSum + (tempResult.get(j).charAt(i) - '0');
}
}
tempSum = tempSum + jinwei;
ans.append(tempSum % 10);
jinwei = tempSum / 10;
}
while(jinwei>0)
{
ans.append(jinwei%10);
jinwei=jinwei/10;
}
ans=ans.reverse();
for(i=0;i<ans.length()-1&&ans.charAt(i)=='0';i++);
return ans.substring(i).toString();
}
}