您的位置:首页 > 其它

大数相乘

2016-03-11 15:33 274 查看
编写任意位数的大数相乘的程序。

经典的方法是:

1)将字符串转为数字并反转(string到vector<int>)

2)逐位相乘,结果放到resultNum中(vecotr<int> resultNum(a.size()+b.size(),0))

3)清除resultNum中多余的0,处理进位

4)将计算结果转为字符串并反转

#include<iostream>
#include <vector>
#include <string>
using namespace std;

struct BigCheng{
vector<int> a;
vector<int> b;
string resultStr;
};

void StrToIntReverse(string data1, string data2, BigCheng &bigCheng)
{
for (int i = data1.size() - 1; i >= 0; --i) bigCheng.a.push_back(data1[i] - '0');
for (int i = data2.size() - 1; i >= 0; --i) bigCheng.b.push_back(data2[i] - '0');
}

void DoCheng(BigCheng &bigCheng, vector<int> &resultNum)
{
/*逐位相乘*/
for (unsigned int i = 0; i < bigCheng.a.size(); i++)
for (unsigned int j = 0; j < bigCheng.b.size(); j++)
resultNum[i + j] += bigCheng.a[i] * bigCheng.b[j];
/*处理多余的0*/
for (int i = resultNum.size() - 1; i >= 0; i--)
{
if (resultNum[i] != 0) break;
else resultNum.pop_back();
}
/*处理进位*/
int c = 0;
for (unsigned int i = 0; i < resultNum.size(); i++)
{
resultNum[i] += c;
c = resultNum[i] / 10;
resultNum[i] = resultNum[i] % 10;
}
if (c != 0) resultNum.push_back(c);
}

void IntToStrReverse(BigCheng &bigCheng, vector<int> &resultNum)
{
for (int i = resultNum.size() - 1; i >= 0; i--)
bigCheng.resultStr.push_back(resultNum[i] + '0');
}

int main() {
while (1)
{
cout << "请输入两个大数: " << endl;
string a, b;
cin >> a >> b;
vector<int> resultNum(a.size() + b.size(), 0);
BigCheng re;
StrToIntReverse(a, b, re);
DoCheng(re, resultNum);
IntToStrReverse(re, resultNum);
cout << re.resultStr << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: