题解 | #大数乘法#
大数乘法
http://www.nowcoder.com/practice/c4c488d4d40d4c4e9824c3650f7d5571
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param s string字符串 第一个整数
* @param t string字符串 第二个整数
* @return string字符串
*/
public String solve (String s, String t) {
// write code here
// 但凡这两个数字有一个为 0,直接返回 0 即可
if ((1 == s.length() && 0 == Integer.valueOf(s)) || (1 == t.length() && 0 == Integer.valueOf(t))) {
return "0";
}
// 获取 s 和 t 字符串的长度
int len1 = s.length();
int len2 = t.length();
// 定义一个 String,用于存放当前一次相乘的结果
String curS = "";
// 定义一个 String,用于存放上一次相乘的结果
String preS = "";
int num = 1;
for (int i = len1 - 1; i > -1; i--) {
// 此时,我们取出了被乘数中的一个数字,与乘数进行相乘,获取它们相乘的结果
curS = multiplication(t, Integer.valueOf(s.charAt(i) + ""));
if (i == len1 - 1) {
preS = curS;
} else {
StringBuffer tmpCurS = new StringBuffer(curS);
for (int j = 1; j <= num; j++) {
tmpCurS.append("0");
}
while (preS.length() != tmpCurS.length()) {
preS = "0" + preS;
}
preS = addition(new String(tmpCurS), preS);
num++;
}
}
// 返回最终的结果
return preS;
}
// 计算一个字符串和单个字符的相乘的结果
public String multiplication(String str1, int num2) {
StringBuffer sb = new StringBuffer("");
int carryBit = 0; // 进位
int unit = 0; // 个位数
int product = 0; // 乘积
for (int i = str1.length() - 1; i > -1; i--) {
// 计算当前两个字符相乘(别忘了加上进位)
product = Integer.valueOf(str1.charAt(i) + "") * num2 + carryBit;
// 获取进位
carryBit = product / 10;
// 获取个位上的数字
unit = product % 10;
// 将个位上的数字添加到 sb 中
sb.append(unit);
}
// 别忘了,最终的进位也要添加到 sb 中
if (carryBit != 0) {
sb.append(carryBit);
}
// 返回最终结果前,反转 sb
return new String(sb.reverse());
}
public String addition(String str1, String str2) {
StringBuffer sb = new StringBuffer("");
int carrayBit = 0; // 进位
int unit = 0; // 个位数
int total = 0; // 和
for (int i = str1.length() - 1; i > -1; i--) {
// 计算当前位置上的两个字符相加(别忘了加上进位)
total = Integer.valueOf(str1.charAt(i) + "") + Integer.valueOf(str2.charAt(i) + "") + carrayBit;
// 获取进位
carrayBit = total / 10;
// 获取个位数
unit = total % 10;
// 将个位上的数字添加到 sb 中
sb.append(unit);
}
// 别忘了,最终的进位也要添加到 sb 中
if (carrayBit != 0) {
sb.append(carrayBit);
}
// 返回最终结果前,反转 sb
return new String(sb.reverse());
}
}