• 8.高精度减法


    假定A和B都是正数,假定A这个数>=B这个数。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 bool cmp(vector<int> &A, vector<int> &B) { //判断是否A>=B,如果A>=B返回true,否则返回false 
     4     if (A.size() != B.size()) {
     5         return A.size() > B.size();
     6     }
     7     for (int i = A.size() - 1; i >= 0; i--) { //从高位开始比较 
     8         if (A[i] != B[i]) {
     9             return A[i] > B[i];
    10         }
    11     }
    12     return true; //A=B也成立 
    13 }
    14 vector<int> sub(vector<int> &A, vector<int> &B) {
    15     vector<int> C;
    16     int t = 0;
    17     //已经保证了A>=B 
    18     for (int i = 0; i < A.size(); i++) {
    19         //还是用t来表示当前这一位 
    20         t = A[i] - t;
    21         if (i < B.size()) {
    22             t -= B[i];
    23         }
    24         //若t>=0,就是t
    25         //若t<0,就是t+10 
    26         //t一定是个位数.-9 ~ 9
    27         C.push_back((t + 10) % 10);
    28         //t不是0就是1 
    29         //t=0表示没有借位
    30         //t=1表示借位了 
    31         if (t < 0) {
    32             t = 1;
    33         } else {
    34             t = 0;
    35         }
    36     }
    37     //去掉前导0 
    38     while (C.size() > 1 && C.back() == 0) {
    39         C.pop_back();
    40     }
    41     return C;
    42 }
    43 int main() {
    44     string a, b;
    45     cin >> a >> b;
    46     vector<int> A, B;
    47     for (int i = a.length() - 1; i >= 0; i--) {
    48         A.push_back(a[i] - '0');
    49     }
    50     for (int i = b.length() - 1; i >= 0; i--) {
    51         B.push_back(b[i] - '0');
    52     }
    53     vector<int> C;
    54     if (cmp(A, B)) { //如果A>=B的话,直接减。5-3 
    55         C = sub(A, B);
    56     } else { //否则:-(3 - 5) 
    57         cout << "-";
    58         C = sub(B, A);
    59     }
    60     for (int i = C.size() - 1; i >= 0; i--) {
    61         cout << C[i];
    62     }
    63     return 0;
    64 }

     2020年9月29日更新:高精度压8位的做法

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int base = 100000000;
     4 bool cmp(vector<int> &A, vector<int> &B) {
     5     if (A.size() != B.size()) {
     6         return A.size() > B.size();
     7     }
     8     for (int i = A.size() - 1; i >= 0; i--) {
     9         if (A[i] != B[i]) {
    10             return A[i] > B[i];
    11         }
    12     }
    13     return true;
    14 }
    15 vector<int> sub(vector<int> &A, vector<int> &B) {
    16     vector<int> C;
    17     int t = 0;
    18     for (int i = 0; i < A.size(); i++) {
    19         t = A[i] - t;
    20         if (i < B.size()) {
    21             t -= B[i];
    22         }
    23         C.push_back((t + base) % base);
    24         if (t < 0) {
    25             t = 1;
    26         } else {
    27             t = 0;
    28         }
    29     }
    30     while (C.size() > 1 && C.back() == 0) {
    31         C.pop_back();
    32     }
    33     return C;
    34 }
    35 int main() {
    36     string a, b;
    37     cin >> a >> b;
    38     vector<int> A, B, C;
    39     for (int i = a.size() - 1, s = 0, j = 0, t = 1; i >= 0; i--) {
    40         s += (a[i] - '0') * t;
    41         j++;
    42         t *= 10;
    43         if (j == 8 || i == 0) {
    44             A.push_back(s);
    45             s = 0;
    46             j = 0;
    47             t = 1;
    48         }
    49     }
    50     for (int i = b.size() - 1, s = 0, j = 0, t = 1; i >= 0; i--) {
    51         s += (b[i] - '0') * t;
    52         j++;
    53         t *= 10;
    54         if (j == 8 || i == 0) {
    55             B.push_back(s);
    56             s = 0;
    57             j = 0;
    58             t = 1;
    59         }
    60     }
    61     if (cmp(A, B)) {
    62         C = sub(A, B);
    63     } else {
    64         cout << "-";
    65         C = sub(B, A);
    66     }
    67     cout << C.back();
    68     for (int i = C.size() - 2; i >= 0; i--) {
    69         printf("%08d", C[i]);
    70     }
    71     return 0;
    72 }
  • 相关阅读:
    [收藏]成大事必备9种能力9种手段9种心态
    招聘第一位网站编辑
    买了两本书
    并行计算Brahma :LINQtoGPU
    PostSharp 1.0 RTM发布了
    .NET StockTrader 2.0 新版本
    Windows Communication Foundation FAQ
    SQL Server 2008基于策略的管理
    WCF 性能基准报告
    ADO.NET实体框架连接串引发的异常:Unable to load the specified metadata resource
  • 原文地址:https://www.cnblogs.com/fx1998/p/12815527.html
Copyright © 2020-2023  润新知