题解:AcWing 794 高精度除法

【题目来源】

AcWing:794. 高精度除法 - AcWing题库

【题目描述】

给定两个非负整数(不含前导 \(0\)\(A\)\(B\) ,请你计算 \(A/B\) 的商和余数。

【输入】

共两行,第一行包含整数 \(A\),第二行包含整数 \(B\)

【输出】

共两行,第一行输出所求的商,第二行输出所求余数。

【输入样例】

7
2

【输出样例】

3
1

【解题思路】

image

【算法标签】

《AcWing 794 高精度除法》 #高精度#

【代码详解】

#include <bits/stdc++.h>
using namespace std;

// 大整数除法函数:A / b,返回商C,余数通过引用r返回
vector<int> div(vector<int> &A, int b, int &r) {
    vector<int> C;  // 存储商
    r = 0;          // 初始化余数为0
    
    // 从高位到低位处理(因为除法是从高位开始的)
    for (int i = A.size() - 1; i >= 0; i--) {
        r = r * 10 + A[i];       // 当前被除数 = 余数*10 + 当前位
        C.push_back(r / b);      // 计算当前位的商
        r %= b;                 // 计算新的余数
    }
    
    // 反转商数组,因为我们是按高位到低位计算的
    reverse(C.begin(), C.end());
    
    // 去除前导零(保留至少一位)
    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;  // 余数
    auto C = div(A, b, r);  // 计算商和余数
    
    // 输出商(需要逆序输出)
    for (int i = C.size() - 1; i >= 0; i--) 
        printf("%d", C[i]);
    
    // 输出余数
    cout << endl << r << endl;
    
    return 0;
}

【运行结果】

7
2
3
1
posted @ 2026-02-20 22:22  团爸讲算法  阅读(2)  评论(0)    收藏  举报