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;

猜你喜欢

转载自blog.csdn.net/qq_43964318/article/details/121435751