给定两个以字符串形式表示的非负整数num1和num2,返回num1和num2的乘积,它们的乘积也表示为字符串形式。
示例:
输入:num1 = “123”,num2 = “456”
输出:“56088”
说明:
- num1和num2的长度小于110。
- num1和num2只包含数字0~9。
- num1和num2均不以零开头,除非是数字0本身。
- 不能使用任何标准库的大整数类型(比如BigInteger)或直接将输入转换为整数来处理。
方法一:普通竖式法
该方法基于我们平常的乘法运算,我们一般在草稿纸上列竖式,用乘数的每一位分别乘以被乘数,然后将这些结果加起来得到最终结果,只不过要注意的是:用乘数的各个位与被乘数相乘所得到的这些数在相加时,需要错位相加。

实际上我们可以将这些错位看成是在数字的后面添上了数字0,这样一来就有规律可循了。在乘数的最后一位(个位)与被乘数相乘的结果后面添上零个0,在乘数的倒数第二位(十位)与被乘数相乘的结果后面添上一个0,在乘数的倒数第三位(百位)与被乘数相乘的结果后面添上两个0,最后将这些结果相加就得到了最终结果。

结论如下: 将乘数的每一位分别与被乘数相乘,并且在乘数的倒数第n位与被乘数相乘的结果后添上n-1个0,再将这些结果相加,即可得到最终结果。
代码如下:
class Solution {
public:
//字符串相乘
string multiply(string num1, string num2) {
if (num1 == "0" || num2 == "0")
return "0";
string retArr; //相乘后的字符串
int flag = 0; //标识需要添加的0的个数
for (int i = num2.size() - 1; i >= 0; i--) //依次取乘数的倒数第一位、倒数第二位、...
{
int count = num2[i] - '0'; //乘数当中待与被乘数相乘的那一位的数字
string tmp; //存储乘数该位与被乘数相乘后的结果(此时为空)
//数count与被乘数相乘,相当于将被乘数加count次到tmp当中
for (int j = 0; j < count; j++)
{
tmp = addStrings(tmp, num1);<

这篇博客介绍了两种用C++实现字符串表示的非负整数乘法的方法。第一种是常规的竖式乘法,通过逐位相乘并添加额外的零来完成;第二种是优化的竖式乘法,利用数组存储中间结果,减少字符串操作,提高效率。这两种方法均避免使用标准库的大整数类型或直接转换为整数。
最低0.47元/天 解锁文章
607

被折叠的 条评论
为什么被折叠?



