在现代计算中,整数除法是最基础的运算之一。然而,当数字的位数远超出机器整型(例如
long long
或
__int128
)所能表示的范围时,传统整型将失去作用。这类问题统称为高精度计算(High Precision Arithmetic)。
在科学计算、加密算法、大数据处理、金融系统(例如精确货币计算)、密码学(如 RSA 密钥运算)等领域中,处理超长整数的需求十分普遍。例如:
而 C++ 标准库虽然功能强大,但默认没有内置“任意精度整数”的支持。因此,必须手动实现高精度算法。本项目旨在从零实现高精度整数除法;支持任意长度整数;输出商与余数;并详细讲解算法原理与实现细节。
A / B
,并输出商和余数;BigInteger
类库;输入:
A = 123456789012345678901234567890 B = 1234567890
输出:
商 = 100000000010000000001 余数 = 890
高精度除法的本质是模拟人类手算除法的过程。
long long
)最大约 10^18,而高精度算法通常需要处理超过 1000 位的数,因此我们使用
std::string
存储大数。例如:
string a = "12345678901234567890";被除数: 789 除数: 4 过程: 7 / 4 = 1 → 余数 3 → 带下 8 → 38 / 4 = 9 → 余 2 → 带下 9 → 29 / 4 = 7 → 余 1 商: 197, 余数: 1
计算机的高精度除法也是这一思路的模拟。输入两个字符串 A、B;判断 B 是否为 0;初始化一个空字符串保存结果商;维护一个字符串
cur
表示当前余数部分;依次从 A 的高位向低位取数字拼入
cur
;用 while 循环计算“cur >= B”时能减多少次(即当前商位);更新商、更新余数;最终去除商前导 0;输出商和余数。整个过程完全仿照人工除法的流程,只不过每个“位操作”都由字符串算法实现。
/******************************************************
* 文件名: BigIntegerDivision.cpp
* 功能: 实现高精度整数除法 (A / B)
* 作者: ChatGPT教学版
******************************************************/
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
/************** 工具函数区 **************/
// 去除字符串前导0
string removeLeadingZeros(string s) {
while (s.size() > 1 && s[0] == '0')
s.erase(s.begin());
return s;
}
// 比较两个大整数字符串
// 返回 1: a>b, 0: a=b, -1: a<b
int compare(const string &a, const string &b) {
if (a.size() > b.size()) return 1;
if (a.size() < b.size()) return -1;
for (size_t i = 0; i < a.size(); i++) {
if (a[i] > b[i]) return 1;
if (a[i] < b[i]) return -1;
}
return 0;
}
// 高精度减法 a - b (假设 a>=b)
string subtract(string a, string b) {
string res = "";
int carry = 0;
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
for (size_t i = 0; i < a.size(); i++) {
int x = a[i] - '0' - carry;
int y = (i < b.size()) ? b[i] - '0' : 0;
if (x < y) {
x += 10;
carry = 1;
} else carry = 0;
res.push_back((x - y) + '0');
}
while (res.size() > 1 && res.back() == '0') res.pop_back();
reverse(res.begin(), res.end());
return removeLeadingZeros(res);
}
// 高精度乘法 b * k (k 为 0~9)
string multiply(const string &b, int k) {
if (k == 0) return "0";
string res = "";
int carry = 0;
for (int i = b.size() - 1; i >= 0; i--) {
int prod = (b[i] - '0') * k + carry;
res.push_back((prod % 10) + '0');
carry = prod / 10;
}
if (carry) res.push_back(carry + '0');
reverse(res.begin(), res.end());
return removeLeadingZeros(res);
}
/************** 高精度除法核心函数 **************/
pair<string, string> divide(string A, string B) {
if (B == "0") {
throw invalid_argument("除数不能为0");
}
A = removeLeadingZeros(A);
B = removeLeadingZeros(B);
if (compare(A, B) < 0) return {"0", A}; // 被除数小于除数
string quotient = "";
string cur = "";
for (size_t i = 0; i < A.size(); i++) {
cur.push_back(A[i]);
cur = removeLeadingZeros(cur);
int q = 0;
while (compare(cur, B) >= 0) {
cur = subtract(cur, B);
q++;
}
quotient.push_back(q + '0');
}
quotient = removeLeadingZeros(quotient);
cur = removeLeadingZeros(cur);
return {quotient, cur};
}
/************** 主函数测试 **************/
int main() {
string A, B;
cout << "请输入被除数 A:" << endl;
cin >> A;
cout << "请输入除数 B:" << endl;
cin >> B;
try {
auto result = divide(A, B);
cout << "商:" << result.first << endl;
cout << "余数:" << result.second << endl;
} catch (exception &e) {
cout << "错误:" << e.what() << endl;
}
return 0;
}
"000123"
。cur
;cur
中减去
B
;cur
即为余数。本项目实现了一个可运行的 C++ 高精度除法程序,核心特性包括:
A / B
输出 100 位精度结果。当前算法在每次循环中最多可减少 9 次操作,通过二分法查找商位来加速。
FFT 加速(快速傅里叶变换)可以在超高精度下提高 10 倍效率。
模板化大数类封装:
BigInteger 类;+ - * / % 等)。GPU 并行优化:利用 CUDA/OpenCL 进行分段除法处理。
嵌入式应用优化:
扫码加好友,拉您进群



收藏
