大数相乘

来源:互联网 发布:类似photosynth的软件 编辑:程序博客网 时间:2024/06/05 13:24

编写任意位数的大数相乘的程序。

经典的方法是:

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;}


0 0
原创粉丝点击