LeetCode 41字符串相乘

LeetCode 41字符串相乘

解题思路:
  1. 本题要求两个字符串数字相乘,显然是个大数乘法的题,结果用一个int类型数组表示。
  2. 首先判断特殊情况,既某一个数字为0。如果出现,直接返回字符串 “0”
  3. 如果结果非0,则将两个字符串翻转,这是因为要按照人类的思维习惯进行乘法,既从个位开始,如果不反转,第一位取的不是个位,而是最高位。
  4. 翻转之后,采用惰性存储法,我们不考虑进位问题,等到后面合并的时候统一考虑进位,现在仅仅将每个乘法的结果错位相乘,那么怎么错位相乘呢?
    (1) . 首先,定义一个index索引,记录当前相乘的结果应该从哪里开始相加,因为是错位,所以要从当前的 i 开始累加,直接相加就行,不用考虑进位问题
  5. 最后每个results数组里应该保存了每一位对应的结果,然后我们开始考虑进位问题。
    (1) . 定义一个变量 cal_next 初始值设为0,用来记录本次到下一数字的进位。
    (2) . 将本次的值直接于cal_next相加,将结果除10 用来计算下一次cal_next的值
    (3) . 再将results中当前的值%10,将当前的位置的值替换掉
  6. 现在开始将字符串进行合并,一定要注意,是从尾巴向前合并,在合并当中,最重要的就是头部去0,由于不知道最后结果长度是多少,所以直接定义最大长度str_len = num1.length() + num2.length()然后再合并的步骤中,增加判断i==0 && results[str_len-i-1] == 0用来判断头部是否为0
源代码:
class Solution {
private:
    int results[250] = {0};
public:
    string multiply(string num1, string num2) {
        int i,j,index = 0;
        int mul1,mul2;
        string Results = "";
        if((num1.length() == 1 && num1[0] - '0' == 0) || (num2.length() == 1 && num2[0] - '0' == 0)){
            return "0";
        }
        reverse(num1.begin(),num1.end());
        reverse(num2.begin(),num2.end());
        for(i=0;i<num1.length();i++){
            index = i;
            mul1 = num1[i] - '0';
            for(j=0;j<num2.length();j++){
                mul2 = num2[j] - '0';
                results[index] += (mul1*mul2);
                index ++;
            }
        }
        int str_len = num1.length() + num2.length(),real_len = 0;
        int cal_next = 0;
        for(i=0;i<str_len;i++){
            real_len ++ ;
            results[i] += cal_next;
            cal_next = results[i] / 10;
            results[i] = results[i] % 10;
        }
        char currentStr;
        for(i=0;i<real_len;i++){
            if(i==0 && results[real_len-i-1] == 0){
                continue;
            }
        	char currentStr = results[real_len-i-1] + '0';
        	//itoa(results[real_len-i-1],currentStr,10);
            Results += currentStr;
        }
        return Results;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值