C++ 高精度减法实现详解与示例代码
以下是一个用C++写的高精度减法的示例代码:
#include <iostream>
#include <vector>
using namespace std;
// 函数用于移除结果前面多余的0
void removeLeadingZeros(vector<int>& num) {
while (num.size() > 1 && num.back() == 0) {
num.pop_back();
}
}
// 高精度减法
vector<int> subtract(vector<int>& num1, vector<int>& num2) {
int n1 = num1.size();
int n2 = num2.size();
vector<int> result(max(n1, n2), 0);
int carry = 0;
for (int i = 0; i < result.size(); i++) {
int digit = (i < n1 ? num1[i] : 0) - (i < n2 ? num2[i] : 0) - carry;
if (digit < 0) {
digit += 10;
carry = 1;
} else {
carry = 0;
}
result[i] = digit;
}
removeLeadingZeros(result);
return result;
}
int main() {
string str1, str2;
cin >> str1 >> str2;
vector<int> num1, num2;
for (int i = str1.size() - 1; i >= 0; i--) {
num1.push_back(str1[i] - '0');
}
for (int i = str2.size() - 1; i >= 0; i--) {
num2.push_back(str2[i] - '0');
}
vector<int> result = subtract(num1, num2);
cout << "Result: ";
for (int i = result.size() - 1; i >= 0; i--) {
cout << result[i];
}
cout << endl;
return 0;
}
这段代码中,我们首先定义了一个removeLeadingZeros函数,用于移除结果前面多余的0。然后定义了一个subtract函数,用于执行高精度减法运算。最后在main函数中,我们读取两个输入字符串,并将其转换为高精度数,然后调用subtract函数进行减法运算,最后输出结果。
示例输入和输出:
输入:
123456789012345678901234567890
123456789012345678901234567890
输出:
Result: 0
代码解析:
removeLeadingZeros函数: 移除结果前面多余的0,确保结果输出简洁。subtract函数: 实现高精度减法运算的核心逻辑。- 通过两个循环,逐位计算两个高精度数的差值,并处理进位情况。
- 使用
carry变量记录进位信息,确保准确的减法运算。
main函数: 读取输入字符串,转换为高精度数,调用subtract函数计算结果,并输出结果。
优化建议:
- 为了提高代码可读性和可维护性,可以使用类封装高精度数的操作,方便后续扩展。
- 可以添加对负数的支持,使代码更通用。
- 可以使用更简洁的算法,例如 Karatsuba 算法,提高运算效率。
通过以上优化,可以构建一个功能强大、易于维护的高精度减法库。
原文地址: https://www.cveoy.top/t/topic/pZtL 著作权归作者所有。请勿转载和采集!