大数除法

高精度除法的主要步骤:
1、以字符串的形式读入一个高精度数和一个单精度数,分别表示被除数和除数。
2、将高精度数按位拆分,存储在数组中,同时定义一个初始值为0的变量x表示余数。
3、模拟竖式除法,从高位到低位,依次计算计算出商的每一位,并更新x。
4、从高位到低位输出数组的值为商。最后的x值为余数。

123456789/45
1/45=0, 1%45=1
12/45=0, 12%45=12
123/45=2, 123%45=33
334/45=7 , 334%45=19
195/45=4, 195%45=15
156/45=3, 156%45=21
217/45=4 217%45=37
378/45=8 378%45=18
189/45=4 189%45=9
最后结果为2743484 余数为9

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/**************************************************************** 
 * Description: 大数除法
 * Author: Alex Li
 * Date: 2024-01-31 05:53:52
 * LastEditTime: 2024-01-31 06:07:30
****************************************************************/
#include <string>
#include <iostream>
using namespace std;

const int MaxLen = 110; // 定义最大长度
string a1; // 用于存储输入的大数
int a[MaxLen], c[MaxLen]; // a用于存储大数的每一位,c用于存储计算的结果

int main() {
    int lena, lenc, x = 0, b; // lena是大数的长度,x用于存储余数,b是除数

    cin >> a1 >> b; // 输入大数和除数
    lena = a1.length(); // 获取大数的长度

    // 将大数的每一位转换成整数并存储在数组a中
    for (int i = 0; i < lena; ++i) {
        a[i] = a1[i] - '0';
    }

    // 进行除法运算
    for (int i = 0; i < lena; ++i) {
        c[i] = (x * 10 + a[i]) / b; // 计算当前位的商
        x = (x * 10 + a[i]) % b; // 更新余数
    }

    // 输出结果
    bool leadingZero = true;
    for (int k = 0; k < lena; ++k) {
        // 跳过结果前导0
        if (c[k] != 0 || !leadingZero) {
            leadingZero = false;
            cout << c[k]; // 输出每位的商
        }
    }

    // 如果结果全为0,则输出0
    if (leadingZero) {
        cout << "0";
    }

    cout << " "; // 输出空格分隔
    cout << x; // 输出余数
    return 0;
}

洛谷P1480

Scroll to Top