大数乘法模拟

 1 // 手动模拟大整数乘法
 2 // 使用c++ 里的vector来储存数据
 3 // 并且倒着储存数字
 4 // 时间复杂度o(n2)
 5 void normalize(vector<int>&  num){
 6     // n 位 * m 位相乘最多生成n + m位
 7     num.push_back(0);
 8     for(int i = 0;i < num.size();i ++){
 9         if(num[i] < 0){
10             int borrow = (abs(num[i] + 9)) / 10;
11             num[i + 1] -= borrow;
12             num[i] += borrow * 10;
13         }
14         else{
15             num[i + 1] += num[i] / 10;
16             num[i] %= 10;
17         }
18     }
19     while(num.size() > 1 && num.back() == 0)num.pop_back();//去掉尾部的0(相当于真正的头部)
20 }
21 
22 
23 vector<int> multiply(const vector<int>& a,
24                      const vector<int>& b){
25     vector<int> c(a.size() + b.size() + 1,0);
26     for(int i = 0;i < a.size();i ++){
27         for(int j = 0;j < b.size();j ++){
28             c[i + j] += a[i] * b[j];
29         }
30     }
31     normalize(c);
32     return c;
33  }

 

posted @ 2019-05-16 21:02  悠久召唤者  阅读(270)  评论(0编辑  收藏  举报