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 添加由链接列表表示的两个数字