• LeetCode Multiply Strings


    Given two numbers represented as strings, return multiplication of the numbers as a string.

    Note: The numbers can be arbitrarily large and are non-negative.

    class Solution {
    public:
        string multiply(string num1, string num2) {
            int len1 = remove_leading_zero(num1);
            int len2 = remove_leading_zero(num2);
    
            string muls[10];
            muls[0] = "0";
            for (int i=1; i<10; i++) {
                muls[i] = add(muls[i-1], num1);
            }
            
            string ending_zero(""), res("");
            int pos2 = len2 - 1;
            while (pos2 >= 0) {
                int c = num2[pos2--] - '0';
                res = add(res, muls[c] + ending_zero);
                ending_zero.insert(ending_zero.end(), '0');
            }
            return res;
        }
        
        string add(string num1, string num2) {
            string res("");
            int pos1 = remove_leading_zero(num1) - 1;
            int pos2 = remove_leading_zero(num2) - 1;
    
            int carry = 0;
            
            while (pos1 >=0 && pos2 >= 0) {
                int c1 = num1[pos1--] - '0';
                int c2 = num2[pos2--] - '0';
                int sum= c1 + c2 + carry;
                carry = sum / 10;
                sum = sum % 10;
                res.insert(res.begin(), sum + '0');
            }
            while (pos1 >=0 ) {
                int c = num1[pos1--] - '0';
                int s = c + carry;
                carry = s / 10;
                s = s % 10;
                res.insert(res.begin(), s + '0');
            }
            while (pos2 >=0 ) {
                int c = num2[pos2--] - '0';
                int s = c + carry;
                carry = s / 10;
                s = s % 10;
                res.insert(res.begin(), s + '0');
            }
            if (carry > 0 ) res.insert(res.begin(), carry + '0');
            return res;
        }
        
        int remove_leading_zero(string& str) {
            int len = str.length();
            int pos = 0;
            
            while(pos < (len - 1) && str[pos] == '0') pos++;
            len = len - pos;
            str = str.substr(pos, len);
            return len;
        }
    };

    200ms,用纯C的话应该可以再快一点,

    方法不对,可以直接在各个数字位相乘时使用乘法:

    class Solution {
    public:
        string multiply(string num1, string num2) {
            int alen = num1.size();
            int blen = num2.size();
            reverse(num1.begin(), num1.end());
            reverse(num2.begin(), num2.end());
            
            vector<int> res(alen + blen, 0);
            
            for (int i=0; i<alen; i++) {
                for (int j=0; j<blen; j++) {
                    res[i + j] += (num1[i] - '0') * (num2[j] - '0');
                }
            }
            int pos = alen + blen - 1;
            while (pos >= 0 && res[pos] == 0) {
                pos--;
            }
            string str;
            int carry = 0;
            for (int i=0; i<=pos; i++) {
                res[i]= res[i] + carry;
                carry = res[i] / 10;
                str.push_back(res[i] % 10 + '0');
            }
            if (carry != 0) {
                str.push_back(carry + '0');
            }
            reverse(str.begin(), str.end());
            if (str.size() == 0) {
                str = "0";
            }
            return str;
        }
    };
  • 相关阅读:
    内部类与外部类的调用
    Docker学习(十二)中遇到的一些问题汇总
    Docker学习(十一)Docker系列结束-新的开始K8S
    Docker学习(十)Docker容器编排 Docker-compose
    Docker学习(九)Volumn容器间共享数据
    Docker学习(八)容器间单向通信
    Docker学习(七)实战
    Docker学习(六)Dockerfile构建自定义镜像
    Docker学习(五) Dockerfile基础命令
    Docker学习(四)Docker搭建Tomcat
  • 原文地址:https://www.cnblogs.com/lailailai/p/3688923.html
Copyright © 2020-2023  润新知