公关就是陪人睡觉吗站内关键词排名优化软件
看到一个博主写得不错,我也照猫画虎:)
原因
在计算两个非负整数时,如果位数很大,连 long long 类型都存储不了,就要使用到高精度的乘法
原理
原理依旧是模拟人计算两个数的积,早在小学我们已经学了竖式运算,如图:
你有没有从中发现什么,个位与个位的乘积在积的个位上,个位与十位的乘积在积的十位上……我们先将所有的乘积保存下来(用一个数组保存),然后对它进行进位处理就可以得到结果。
另外结果的长度是多少呢?可以从上图得出,不管怎么样,长度的基础是其中一个数的长度,另外一个数的长度是乘的次数,第一次乘不会向左移,所以最终的长度是:数A 的长度 + 数 B的长度 - 1。
步骤
先将数 A 数 B 存储
再将 A、B 每一位的乘积用数组存储
然后对数组进行进位处理,将结果放进答案动态数组
最后打印就好了
代码
#include <iostream>
#include <vector>
#include <string>using namespace std;int c[200]; //A和B的位数都小于100位,存储着各个位上的乘积和vector <int> mul(vector <int>& A, vector <int>& B)
{vector <int> C;for (int i = 0; i < (int)A.size(); i++){for (int j = 0; j < (int)B.size(); j++){c[i + j ] +=( A[i] * B[j] ); // 下标从0开始,注意下标}}int t = 0; //表示进位for (int i = 0; i < (int)(A.size() + B.size()) ; i++) //结果的最大位数就是A.size() + B.size() - 1{t += c[i];C.push_back(t % 10);t /= 10;}//我看到很多人的代码都有去前导0,可是乘法好像不会出现这种情况return C;
}int main(void)
{string a, b;cin >> a >> b;vector <int> A, B;for (int i = (int)a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0'); //逆序存储for (int i = (int)b.size() - 1; i >= 0; i--) B.push_back(b[i] - '0');auto C = mul(A, B);for (int i = (int)C.size() - 1; i >= 0; i--) //逆序打印{cout << C[i];}return 0;}