Leetcode刷题之字符串相乘

  1. 题目:
    给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
  2. 解题思路:
    这种题目就是找规律,解题的关键钥匙就是:num1的第i位(高位从0开始) 和 num2 的第j位 相乘的结果在乘积中的位置是([i+j,i+j+1]),这样我们就可以用两个循环,从高位(index大的位置)开始,依次相乘得到temp,应为i,j位置的乘积结果保存的位置是[i+j,i+j+1],所以先用temp加上mul[i+j+1] 位置的值,这样就能实现进位。mul[i+j] += temp /10;
    mul[i+j+1] = temp %10;
  3. 解题代码:
class Solution {
public:
    string multiply(string num1, string num2) {
        //解题的关键思路
        //num1的第i位(高位从0开始) 和 num2 的第j位 相乘的结果在乘积中的位置是([i+j,i+j+1])
        int l1 = num1.length()-1;
        int l2 = num2.length()-1;
        //cout << l1 <<"," <<l2 <<endl;
        if(l1 < 0 || l2 < 0){
            return "";
        }
        int mul[l1+l2+2]; //c++定义数组的方法
        int temp = 0;
        
        //这一步必不可少
        memset(mul,0,(l1+l2+2)*sizeof(int));
        for(int i = l1 ; i >= 0 ;i--){
            for(int j = l2; j >=0 ;j--){
                temp = (num1[i] - '0') * (num2[j] - '0');
                //cout << temp<<endl;
                //必须先要加上低位之后再进行是否进位的判断
                temp = mul[i+j+1] + temp;

                mul[i+j] += temp / 10;
                mul[i+j+1] = temp % 10;
            } 
        }

        string sum ;
        //去掉前导的0
        int i = 0;
        while(mul[i] == 0 && i < l1+l2+1){
            i++;
        }
        for(i;i < l1+l2+2 ;i++){
            if(mul[i] > 9){
                sum += mul[i]/10 + '0';
                sum += mul[i]%10 + '0';
            }else{
                sum += mul[i] + '0';
            }
        }
        return sum;
    }
};
  1. tips:
    char 与 int 的相互转换:
    char -> int : char - ‘0’;
    int -> char: int + ‘0’;

memset()的使用:
最后一个参数是字节数,而不是数组的长度。
在c++定义数组的时候可以配合初始化。
(1)int array[10];
(2)int* array = new int[n];(利用指针)。释放内存:delete[] array;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

强大的RGG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值