目录
牛客_NC10大数乘法_C++_Java
题目解析
根据列竖式运算的过程模拟即可。
但是可以改进一下列竖式的过程:
- 先计算⽆进位相乘并且相加后的结果,
- 然后再处理进位。
C++代码
class Solution
{
public:
string solve(string s, string t)
{
reverse(s.begin(), s.end());
reverse(t.begin(), t.end());
int m = s.size(), n = t.size();
vector<int> tmp(m + n);
// 1. ⽆进位相乘相加
for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
{
tmp[i + j] += (s[i] - '0') * (t[j] - '0');
}
}
// 2. 处理进位
int c = 0;
string ret;
for(auto x : tmp)
{
c += x;
ret += c % 10 + '0';
c /= 10;
}
while(c)
{
ret += c % 10 + '0';
c /= 10;
}
// 3. 处理前导零
while(ret.size() > 1 && ret.back() == '0')
{
ret.pop_back();
}
reverse(ret.begin(), ret.end());
return ret;
}
};
Java代码
import java.util.*;
public class Solution
{
public String solve (String ss, String tt)
{
char[] s = new StringBuffer(ss).reverse().toString().toCharArray();
char[] t = new StringBuffer(tt).reverse().toString().toCharArray();
int m = s.length, n = t.length;
int[] tmp = new int[m + n];
// 1. ⽆进位相乘相加
for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
{
tmp[i + j] += (s[i] - '0') * (t[j] - '0');
}
}
// 2. 处理进位
StringBuffer ret = new StringBuffer();
int c = 0;
for(int x : tmp)
{
c += x;
ret.append((char)(c % 10 + '0'));
c /= 10;
}
while(c != 0)
{
ret.append((char)(c % 10 + '0'));
c /= 10;
}
// 3. 处理前导零
while(ret.length() > 1 && ret.charAt(ret.length() - 1) == '0')
{
ret.deleteCharAt(ret.length() - 1);
}
return ret.reverse().toString();
}
}