本人是经过以前看到的博主知道的,而后今天又碰到了相似的题目,仍是要记录一下,否则又忘记还得去找。ios
经过用字符串彻底模拟两个数相乘,相信你们确定是能作到了(是否是彻底模拟的是否是特TM难受)。可是在模拟的基础上加上一些技巧,效率就变得不同了,代码也变得简洁了。数组
主要想法:把二个乘数的每一位拆分出来(字符串很好作到)分别放到一个数组中(其实乘数自己就是一个字符数组),而后进行两两相乘,获得另外一个结果数组。spa
表示为 res[i+j] += (num1[i]-'0')*(num[j]-'0'); 其中i表示num1中数字字符的位置,j表示num2中数字字符的位置, -'0'是把数字字符转成数字。code
如下是以:1234*1234为例blog
第一步:两两相乘获得结果数组res[i+j] += (num1[i]-'0')*(num[j]-'0');字符串
画的很差不要介意,哈哈。string
第二步:经过结果数组拿到最终1234*1234的结果字符串字符串。it
代码以下:io
#include <iostream> #include <string> #include <math.h> #include <algorithm> #include <vector> using namespace std; string mulNums(string a, string b) { // 建立两两相乘后结果的数组,大小可见。 vector<int> res(a.size()+b.size()-1, 0); string ret; // res[i+j] += (num1[i]-'0')*(num[j]-'0'); for (int i = 0; i < a.size(); i++) { for (int j = 0; j < b.size(); j++) { res[i+j] += (a[i]-'0')*(b[j]-'0'); } } // 结果数组转最终结果 int flag = 0; int m; for (int i = res.size()-1; i >= 0; i--) { m = res[i]+flag; ret = (char)(m%10+'0')+ret; flag = m/10; } if (flag) ret = (char)(flag+'0')+ret; return ret; } int main() { cout << mulNums("12345", "67890111") << endl; return 0; }