zoukankan      html  css  js  c++  java
  • 9.高精度乘法

     

    不用保证A>=B

    大数乘小数

    这里是把小数b当成一个整体来乘。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 vector<int> mul(vector<int> &A, int b) {
     4     vector<int> C;
     5     int t = 0; //最开始的进位是0 
     6     for (int i = 0; i < A.size() || t; i++) { //要么i没循环完,要么t不为0
     7         if (i < A.size()) {
     8             t += A[i] * b; //相乘再加上上一位的进位
     9         } 
    10         C.push_back(t % 10); //当前这一位的结果 
    11         t /= 10; //进位
    12         //加法模板里,t不是0就是1
    13         //乘法模板里,t就有很多情况了 
    14     }
    15     while (C.size() > 1 && C.back() == 0) {
    16         C.pop_back();
    17     }
    18     return C;
    19 }
    20 int main() {
    21     string a; //a很长 
    22     int b; //b很短 
    23     cin >> a >> b;
    24     vector<int> A, C;
    25     for (int i = a.length() - 1; i >= 0; i--) {
    26         A.push_back(a[i] - '0');
    27     }
    28     C = mul(A, b);
    29     for (int i = C.size() - 1; i >= 0; i--) {
    30         cout << C[i];
    31     }
    32     return 0;
    33 }

    大数乘以大数

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 vector<int> mul(vector<int> &A, vector<int> &B) {
     4     vector<int> C(A.size() + B.size());
     5     for (int i = 0; i < A.size(); i++) {
     6         for (int j = 0; j < B.size(); j++) {
     7             C[i + j] += A[i] * B[j];
     8         }
     9     }
    10     int t = 0;
    11     for (int i = 0; i < C.size(); i++) {
    12         t += C[i];
    13         C[i] = t % 10;
    14         t /= 10;
    15     }
    16     while (C.size() > 1 && C.back() == 0) {
    17         C.pop_back();
    18     }
    19     return C;
    20 }
    21 int main() {
    22     string a, b;
    23     cin >> a >> b;
    24     vector<int> A, B, C;
    25     for (int i = a.size() - 1; i >= 0; i--) {
    26         A.push_back(a[i] - '0');
    27     }
    28     for (int i = b.size() - 1; i >= 0; i--) {
    29         B.push_back(b[i] - '0');
    30     }
    31     C = mul(A, B);
    32     for (int i = C.size() - 1; i >= 0; i--) {
    33         cout << C[i];
    34     }
    35     return 0;
    36 }

     2020年9月29日更新:其实如果开的是vector<long long>的话,还可以多压几位,不过一般用不到。

    下面的是开vector<int>压4位的做法

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int base = 10000;
     4 vector<int> mul(vector<int> &A, vector<int> &B) {
     5     vector<int> C(A.size() + B.size());
     6     for (int i = 0; i < A.size(); i++) {
     7         for (int j = 0; j < B.size(); j++) {
     8             C[i + j] += A[i] * B[j];
     9         }
    10     }
    11     int t = 0;
    12     for (int i = 0; i < C.size(); i++) {
    13         t += C[i];
    14         C[i] = t % base;
    15         t /= base;
    16     }
    17     while (C.size() > 1 && C.back() == 0) {
    18         C.pop_back();
    19     }
    20     return C;
    21 }
    22 int main() {
    23     string a, b;
    24     cin >> a >> b;
    25     vector<int> A, B, C;
    26     for (int i = a.size() - 1, s = 0, j = 0, t = 1; i >= 0; i--) {
    27         s += (a[i] - '0') * t;
    28         j++;
    29         t *= 10;
    30         if (j == 4 || i == 0) {
    31             A.push_back(s);
    32             s = 0;
    33             j = 0;
    34             t = 1;
    35         }
    36     }
    37     for (int i = b.size() - 1, s = 0, j = 0, t = 1; i >= 0; i--) {
    38         s += (b[i] - '0') * t;
    39         j++;
    40         t *= 10;
    41         if (j == 4 || i == 0) {
    42             B.push_back(s);   
    43             s = 0;
    44             j = 0;
    45             t = 1;
    46         }
    47     }
    48     C = mul(A, B);
    49     cout << C.back();
    50     for (int i = C.size() - 2; i >= 0; i--) {
    51         printf("%04d", C[i]);
    52     }
    53     return 0;
    54 }

     然后就是开vector<long long>压9位的做法

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int base = 1000000000;
     4 typedef long long ll;
     5 vector<ll> mul(vector<ll> &A, vector<ll> &B) {
     6     vector<ll> C(A.size() + B.size());
     7     for (int i = 0; i < A.size(); i++) {
     8         for (int j = 0; j < B.size(); j++) {
     9             C[i + j] += A[i] * B[j];
    10         }
    11     }
    12     ll t = 0;
    13     for (int i = 0; i < C.size(); i++) {
    14         t += C[i];
    15         C[i] = t % base;
    16         t /= base;
    17     }
    18     while (C.size() > 1 && C.back() == 0) {
    19         C.pop_back();
    20     }
    21     return C;
    22 }
    23 int main() {
    24     string a, b;
    25     cin >> a >> b;
    26     vector<ll> A, B, C;
    27     for (int i = a.size() - 1, s = 0, j = 0, t = 1; i >= 0; i--) {
    28         s += (a[i] - '0') * t;
    29         j++;
    30         t *= 10;
    31         if (j == 9 || i == 0) {
    32             A.push_back(s); 
    33             s = 0;
    34             j = 0;
    35             t = 1;
    36         }
    37     }
    38     for (int i = b.size() - 1, s = 0, j = 0, t = 1; i >= 0; i--) {
    39         s += (b[i] - '0') * t;
    40         j++;
    41         t *= 10;
    42         if (j == 9 || i == 0) {
    43             B.push_back(s); 
    44             s = 0;
    45             j = 0;
    46             t = 1;
    47         }
    48     }
    49     C = mul(A, B);
    50     cout << C.back();
    51     for (int i = C.size() - 2; i >= 0; i--) {
    52         cout << setw(9) << setfill('0') << C[i];
    53     }
    54     return 0;
    55 }
  • 相关阅读:
    总结!!!总结!!!
    Beta 总结
    BETA-7
    BETA-6
    BETA-5
    BETA-4
    BETA-3
    华为云-软件产品案例分析
    BETA-2
    BETA-1
  • 原文地址:https://www.cnblogs.com/fx1998/p/12817303.html
Copyright © 2011-2022 走看看