大数乘法的实现在于利用理论上无限大的数据结构来替代基本数据类型。
本文实现了用string得到大数,同时利用vector容器来进行计算的程序,具体思路为:
1、利用string变量输入大数,将其每个数字放入vector变量中;
2、利用乘法运算规律进行计算:
(1)、将乘数与被乘数每一位利用两个for循环进行乘法运算,将结果保存于result中,其中result的位数为两个数的位数之和-1;
(2)、定义一个标识符跟随乘数的位变化(程序中的k就是),每一次的result中的某一位都要进行自身加上新乘积;
(3)、对result每一位从尾到头进行进位操作;
(4)、如果最高位有进位则在vector头部插入以为,值为进位所得值。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
using std::vector;
void mymultiply(const vector<int> &a, const vector<int> &b, vector<int> &result)
{
int i, j, k;
int tmp;
for (i = 0; i < a.size(); ++i)
{
k = i;
for (j = 0; j < b.size(); ++j)
{
result[k] = result[k]+a[i] * b[j];
k=k+1;
}
}
for (k = result.size() – 1; k >= 0; –k)
{
if (result[k] > 9)
{
if (k != 0)
{
result[k-1] += result[k] / 10;
result[k] %= 10;
}
else
{
tmp = result[k] / 10;
result[k] %=10;
result.insert(result.begin(), tmp);
}
}
}
}
int main(void)
{
int i;
string s;
cout << “please input two big numbers: \n”;
cin >> s;
vector<int> a;
a.reserve(s.size());
//get the integer from string
for (i = 0; i < s.size(); ++i)
{
a.push_back(s[i] – ‘0’);
}
cin >> s;
vector<int> b;
b.reserve(s.size());
for (i = 0; i < s.size(); ++i)
{
b.push_back(s[i] – ‘0’);
}
vector<int> c(a.size() + b.size() -1,0);
mymultiply(a, b, c);
for (i = 0; i < c.size(); ++i)
{
cout << c[i];
}
cout <<endl;
return 0;
}