高精度模板(Vector實現更加方便)

計算的數long long 甚至更大的數據類型的都存不下的時候,應該怎麼辦 ?

解決方法 :咱們能夠把一個很大的數當作字符串進行處理,這時候就須要用到高精度。

話很少說,我們邊看代碼邊處理 :

加法 :

PK一下ios

#include <vector>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

int main(void) {
    vector<int> add(vector<int> &A,vector<int> &B);   
        // Vector容器至關因而一個數組,比數組處理起來更加方便 (返回一個 vector 類型的值)
    vector<int>A,B,C;
    string a,b;
    cin >> a >> b;                                    // 輸入兩個大數
    for(int i = a.length() - 1; ~i; i --) A.push_back(a[i] - '0');  
         // 咱們進行加法的時候要從低位開始,字符串輸入的時候低位在最後,因此咱們要將字符串逆序存儲在容器中
    for(int i = b.length() - 1; ~i; i --) B.push_back(b[i] - '0');
    C = add(A,B);
    for(int i = C.size() - 1; ~i; i --) cout << C[i];                
        // 同理,輸出的時候也要逆序輸出
    return 0;
}

vector<int> add(vector<int> &A,vector<int> &B) {
    if(A.size() < B.size()) return add(B,A);         // 儘可能用長的 + 短的,由於這樣多餘的部分咱們就能夠直接進行處理了
    vector<int> C;                                   // 設置一個 vector 類型的變量,用來做爲返回的值
    int t = 0;
    for(int i = 0; i < A.size(); i ++) {
        t += A[i];
        if(B.size() > i) t += B[i];              // B 有必定的限制,不能一直加 呀 
        C.push_back(t % 10);
        t /= 10;                                 // 進位 
    }
    if(t) C.push_back(t);                            // 可能會多出來一個,例如3位數 + 3 位數 ,結果有多是 4 位數
    return C;

}

減法 :

注意 : 一、答案有多是負數
         二、最後存儲在 vector 中的字符串可能會存在前導 0

PK一下數組

Code :

#include <vector>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

int main(void) {
    void ClearZero(vector<int> &A);                          // Clear 前導 0
    bool cmp(vector<int> &A,vector<int> &B);                 // 比較兩個字符串,讓 大的減去 小的
    vector<int> sub(vector<int> &A,vector<int> &B);
    
    vector<int>A,B,C;
    string a,b;
    cin >> a >> b;
    for(int i = a.length() - 1; ~i; i --) A.push_back(a[i] - '0');
    for(int i = b.length() - 1; ~i; i --) B.push_back(b[i] - '0');
    ClearZero(A),ClearZero(B);                              // 先去除字符串計算自己的的前導 0
    if(cmp(A,B)) {
        C = sub(A,B);
    } else {
        C = sub(B,A);                                  // 交換
        cout << "-";                                   // 輸出 - 表明負數
    }
    for(int i = C.size() - 1; ~i; i --) cout << C[i];
    cout << endl << r << endl; 
    return 0;
}

void ClearZero(vector<int> &A) {
    while(A.size() > 1 && A.back() == 0) A.pop_back();
    return ;
}

bool cmp(vector<int> &A,vector<int> &B) {
    if(A.size() != B.size()) return A.size() >= B.size();
    for(int i = A.size(); ~i; i --) {                                // 倒序
        if(A[i] != B[i]) {                                       // 長度相同時則進行字典序比較
            return A[i] > B[i];
        }
    }
    return true;
}

vector<int> sub(vector<int> &A, vector<int> &B)
{
   vector<int>C;
   int t = 0;
   for(int i = 0; i < A.size(); i ++) {
        t = A[i] - t;
        if(B.size() > i) t -= B[i];
        C.push_back((t + 10) % 10);
        if(t < 0) t = 1;                             // 若是獲得的是負數,說明須要借位,這時候下次計算時就須要 - 1
        else t = 0;
   } 
  while(C.size() > 1 && C.back() == 0) C.pop_back();         // Clear 前導 0
   return C;
}

乘法(高精度 * 整數) :

PK一下函數

#include <vector>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

int main(void) {

    vector<int> mul(vector<int> &A,int b);
    
    vector<int>A,B,C;
    string a;
    int value;
    cin >> a >> value;
    for(int i = a.length() - 1; ~i; i --) A.push_back(a[i] - '0');
    C = mul(A,value);
    for(int i = C.size() - 1; ~i; i --) cout << C[i];
    return 0;
}

vector<int> mul(vector<int> &A,int b) {
    int t = 0;
    vector<int> C;
    for(int i = 0; i < A.size(); i ++) {   // 模擬乘法過程
        t += A[i] * b;
        C.push_back(t % 10);
        t /= 10;
    }
    while(t) {                             // 處理最後的那個數
        C.push_back(t % 10);
        t /= 10;
    }
    return C;
}

除法:

PK一下spa

#include <vector>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

int main(void) {
    vector<int> div(vector<int> &A,int b,int &r);
    
    vector<int>A,B,C;
    string a;
    int value;
    cin >> a >> value;
    for(int i = a.length() - 1; ~i; i --) A.push_back(a[i] - '0');
    int r;  // 餘數
    C = div(A,value,r);
    for(int i = C.size() - 1; ~i; i --) cout << C[i];
    cout << endl << r << endl;
    return 0;
}


vector<int> div(vector<int> &A,int b,int &r) {   // 引用變量,至關因而全局變量,直接在函數內部進行修改
    vector<int> C;
    r = 0;                                   // 初始化
    for(int i = A.size() - 1; ~i; i --) {    // 除法是從高位向低位進行的
        r = r * 10 + A[i];               // 獲得除數,每次向後移動一位(餘數要乘 10 -- 能夠模擬一下,很好理解)
        C.push_back(r / b);              // 剛開始可能爲 0
        r %= b;
    }
    reverse(C.begin(),C.end());              // 反轉是爲了處理前導 0 
    while(C.size() > 1 && C.back() == 0) C.pop_back();
    return C;
}
相關文章
相關標籤/搜索