高精度减法是处理大数运算的另一个基本操作。与高精度加法类似,我们可以使用字符串来表示大数,并进行逐位的减法运算。 以下是一个高精度减法的函数实现: #include <iostream>
#include <string>
#include <algorithm>
// 高精度减法函数
std::string bigIntegerSubtract(const std::string& num1, const std::string& num2) {
// 确保num1比num2大,如果不是,则交换它们
if (num1 < num2) {
std::swap(num1, num2);
}
// 反转字符串以进行减法运算
std::string num1_reversed = num1;
std::string num2_reversed = num2;
std::reverse(num1_reversed.begin(), num1_reversed.end());
std::reverse(num2_reversed.begin(), num2_reversed.end());
std::string result;
int borrow = 0;
int index1 = 0;
int index2 = 0;
// 逐位相减,直到num2遍历完
while (index2 < num2_reversed.size()) {
int digit1 = index1 < num1_reversed.size() ? num1_reversed[index1++] - '0' : 0;
int digit2 = num2_reversed[index2++] - '0';
if (digit1 < digit2 + borrow) {
// 如果当前位不够减,从高位借位
digit1 += 10;
borrow = 1;
} else {
borrow = 0;
}
result.push_back((digit1 - digit2 - borrow) + '0');
}
// 将剩余的num1的位数添加到结果中
while (index1 < num1_reversed.size()) {
result.push_back(num1_reversed[index1++] + '0');
}
// 移除结果前面的所有0
size_t pos = result.find_first_not_of('0');
if (pos != std::string::npos) {
result.erase(0, pos);
} else {
// 如果结果都是0,确保至少有一个'0'
result = "0";
}
// 反转结果字符串以获得最终结果
std::reverse(result.begin(), result.end());
return result;
}
int main() {
std::string num1 = "9876543210987654321";
std::string num2 = "12345678901234567890";
std::string difference = bigIntegerSubtract(num1, num2);
std::cout << "Difference: " << difference << std::endl;
return 0;
}
这个函数bigIntegerSubtract 接受两个字符串类型的大整数作为参数,首先确保num1 大于或等于num2 ,然后反转这两个字符串进行逐位的减法运算。 在减法过程中,如果当前位不够减,则从高位借位(借位即加10)。最后,将剩余的num1 的位数添加到结果中,并移除结果前面的所有零。 请注意,这个函数假设输入的字符串是合法的非负整数,并且num1 至少和num2 一样大。如果需要处理负整数或验证输入的有效性,你需要添加额外的逻辑。 此外,这个函数没有进行任何优化,对于非常大的数,效率可能不是最优的。
(责任编辑:admin) |