c_cpp 给定两个表示为字符串的数字,将数字作为字符串返回乘法。注意:数字可以任意大

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 给定两个表示为字符串的数字,将数字作为字符串返回乘法。注意:数字可以任意大相关的知识,希望对你有一定的参考价值。

// step1: reverse two strings
// step2: calculate digit-wise multiplication and sum
// step3: update each digit, handle carry, and reverse back
// step4: remove leading chars '0' in the string "res"

string multiply_two_strings(string s1, string s2) {
    int n1 = s1.size(), n2 = s2.size();
    string res;
    if(s1.empty() || s2.empty()) return res;
    
    // step1: reverse two strings
    reverse(s1.begin(), s1.end());
    reverse(s2.begin(), s2.end());
    
    // step2: calculate digit-wise multiplication and sum
    vector<int> r(n1 + n2, 0);
    for(int i=0; i<n1; i++) {
        int a = s1[i] - '0';
        for(int j=0; j<n2; j++) {
            int b = s2[j] - '0';
            r[i+j] += a * b;            // gist1, cannot forget + in +=
        }
    }
    
    // step3: update each digit, handle carry, and reverse back
    for(int i=0; i<r.size()-1; i++) {   // note, from 1 to r.size()-2, ignore the last one for now
        int digit = r[i] % 10, carry = r[i] / 10;
        r[i] = digit;
        r[i+1] += carry;                // gist2, cannot forget +
        res += r[i] + '0';              // gist3, cannot write "0"
    }
    res += r[r.size()-1] + '0';         // gist4, cannot forget the last digit
    reverse(res.begin(), res.end());

    // step4: remove leading chars '0' in the string "res"
    int start = 0;
    while(start < res.size() && res[start] == '0') start++;
    if(start == r.size()) return "0";
    
    return res.substr(start);
}

// =================== concise & clean version =======================
string multiply_two_big_integer(string& n1, string& n2) { // cannot use const because of "reverse"
    if(n1.empty() || n2.empty()) return "";
    int len1 = n1.size(), len2 = n2.size();
    vector<int> res(len1+len2+1, 0);
    
    reverse(n1.begin(), n1.end());
    reverse(n2.begin(), n2.end());

    for(int i=0; i<len1; i++) {
        for(int j=0; j<len2; j++) {
            res[i+j] += (n1[i] - '0') * (n2[j] - '0'); // should be += not =
        }
    }
    
    int carry = 0;
    string final;
    for(int i=0; i<res.size(); i++) {
        res[i] += carry;
        carry = res[i] / 10;
        res[i] %= 10;
        final += res[i] + '0';
    }
    reverse(final.begin(), final.end());
    
    int j=0;
    while(final[j] == '0') j++;
    
    return final.substr(j);
}

以上是关于c_cpp 给定两个表示为字符串的数字,将数字作为字符串返回乘法。注意:数字可以任意大的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 将大数字表示为字符串

c_cpp 除以表示为字符串的大数字

c_cpp 将根与叶数相加。给定仅包含0-9的数字的二叉树,每个根到叶路径可以表示数字。一个例子

如何添加表示为两个非空链表的两个整数?

我可以将给定的单词(String)表示为数字吗?

c_cpp 添加由链接列表表示的两个数字