大整数乘法

来源:互联网 发布:gopro软件中文版 编辑:程序博客网 时间:2024/06/05 05:23
#include <iostream>#include <string>using namespace std;class StringMultiply{private:string x;string y;public:StringMultiply(string x, string y){//对齐if (x.length() < y.length()){while (x.length() < y.length()){x = "0" + x;}}if (x.length() > y.length()){while (x.length() > y.length()){y = "0" + y;}}this->x = x;this->y = y;}string doMultiply(string x, string y){//边界条件if (x.empty() || y.empty()){return "";}if (x.length() == 1 && y.length() == 1){int vx = x[0] - '0';int vy = y[0] - '0';int vz = vx * vy;return to_string(vz);}int xlen = x.length() / 2;string xh = x.substr(0, xlen);string xl = x.substr(xlen, x.length());int ylen = y.length() / 2;string yh = y.substr(0, ylen);string yl = y.substr(ylen, y.length());string p1 = doMultiply(xh, yh);for (int i = 0; i < xl.length() + yl.length(); i++){p1 += "0";}string p2 = doMultiply(xh, yl);for (int i = 0; i < yl.length(); i++){p2 += "0";}string p3 = doMultiply(xl, yh);for (int i = 0; i < xl.length(); i++){p3 += "0";}string p4 = doMultiply(xl, yl);string r = stringAdd(p1, p2);r = stringAdd(r, p3);r = stringAdd(r, p4);return r;}//相加string stringAdd(string x, string y){//由于数值计算的原因有可能导致字符串长度不同if (x.length() < y.length()){int len = y.length() - x.length();for (int i = 0; i < len; i++){x = "0" + x;}}if (x.length() > y.length()){int len = x.length() - y.length();for (int i = 0; i < len; i++){y = "0" + y;}}int len = x.length() - 1;string result = "";int advance = 0;while (len >= 0){int vx = x[len] - '0';int vy = y[len] - '0';int vz = vx + vy + advance;advance = vz / 10;result = to_string(vz % 10) + result;len--;}//cout << result << endl;if (advance > 0)result = to_string(advance) + result; //去除最高位的0int rlen = result.length();int i = 0;while (i < rlen && result[i] == '0'){result = result.substr(0, 1);i++;}return result;}string getResult(){return doMultiply(this->x, this->y);}};int main(){string x = "10";string y = "123";StringMultiply strMul(x, y);cout << strMul.getResult() << endl;return 0;}

/*
问题描述:大整形数相乘,假定有两个字符串表示的整形数,要求写一个函数,实现两个数字字符串的乘积,函数返回值也是字符串。
来源:网易算法课
作者:syt

日期:2017-9-28

思路:采用公开课里面的分治的思想,将一个字符串逐步划分成单个字符串相乘,最后相加得到最后的字符串,算法最后没有对最高位是0做处理,补充了对最高位的处理

*/