基礎算法-高精度除法

高精度除法

Method

  1. 從除數最高位開始除以被除數。
  2. 將餘數加到下一位:數*10 + 下一位數。
  3. 取出r/b高位,得到商,以及r%b低位,用r來存進位。
  4. 最後得到的結果是逆序的,所以需要反轉,然後去除前導。

Example

給定兩個正整數A,B,請你計算 A / B的商和餘數。

輸入格式

共兩行,第一行包含整數A,第二行包含整數B。

輸出格式

共兩行,第一行輸出所求的商,第二行輸出所求餘數。

數據範圍

1≤A的長度≤1000001≤A的長度≤100000,
1≤B≤100001≤B≤10000

輸入樣例:

7
2

輸出樣例:

3
1
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
//核心思想:1、從除數最高位開始除以被除數。
//2、將餘數加到下一位:數*10 + 下一位數
//3、取出r/b高位,得到商,以及r%b低位,用r來存進位。
//4、最後得到的結果是逆序的,所以需要反轉,然後去除前導。
vector<int> div(vector<int> &A, int b, int &r)//r是引用
{
    vector<int> C;//商
    r = 0;
    for (int i = A.size() - 1; i >=0; i --)//從最高位開始做,將餘數加到下一位
    {
        r = r * 10 + A[i];
        C.push_back(r / b);
        r %= b;
    }
    //得到的C是逆序的,所以需要反轉
    reverse(C.begin(), C.end());
    //去除前導如果最高位是0則去除
    while(C.size() > 1 && C.back() == 0) C.pop_back();
    
    return C;
}

int main()
{
    string a;
    int b;
    
    cin >> a >> b;
    
    vector<int> A;
    for (int i = a.size() - 1; i >= 0; i --) A.push_back(a[i] - '0');
    
    int r;//r是餘數
    //方法輸入:除數 被除數 餘數
    auto C = div(A, b, r);
    
    for (int i = C.size() - 1; i >= 0; i --) printf("%d", C[i]);
    
    cout << endl << r << endl;
}

 

發佈了100 篇原創文章 · 獲贊 14 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章