【入门级-算法-5、数值处理算法:高精度的加法】

1、为什么需要高精度算法?
在编程中,基本数据类型(如short, int,long long)能够表示的整数范围是有限的。例如,在C++中,一个 long long 类型通常只能表示大约 -9e18 到 9e18 之间的整数。当我们需要使用一个比这个范围更大的整数(例如,1000位的整数)进行运算时,标准的数据类型就无法满足我们的要求了。这时,我们就需要使用高精度算法(也被称为“大数运算”)来解决我们的实际问题。

2、高精度的加法核心原理
高精度加法通过将超大数拆分为单个数字,存储在数组或列表中,再逐位相加并处理进位,最终得到结果。就像模拟我们在纸上进行竖式加法的过程。
比如计算2个大的算据1 2 3 4 5 6 7 8 9和9 8 7 6 5 4 3 2 1相加
1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1
10 10 10 10 10 10 10 10 10 (对应位相加)
1 1 1 1 1 1 1 1 1 0 (处理进位)
= 1 1 1 1 1 1 1 1 1 0 (最终结果)

3、高精度的加法实现方法分解
1.数据存储:将两个大数字符串形式读入,并转换成数组(或直接使用字符串)。为了便于处理进位,我们通常将数字的个位存储在数组的第0位(即逆序存储)。
例如:“12345” 存储为数组 A = [5, 4, 3, 2, 1]。
这样做是为了让最低位(个位)对齐数组的起始索引,方便从右到左逐位相加。

2.逐位相加:从数组的起始位置(即数字的个位)开始,对应位数字相加,再加上上一位的进位(也可能没有进位产生,即进位值为零)。
计算公式为:当前和 = 数A当前位 + 数B当前位 + 进位。
3.处理进位:
当前位的结果为:当前和 % 10,存入结果数组。
新的进位为:当前和 /10,用于下一位计算。
处理剩余进位:当两个数的所有位都相加完毕后,若仍有进位(如 999 + 1 = 1000),需将进位追加到结果数组。
4.结果整理:将结果数组逆序,转换为字符串或数字形式,得到最终结果,由于结果是逆序存储的,输出时需要从后往前(即从最高位到最低位)输出。

4、代码实现
#include
#include
#include // 用于reverse函数
namespace std;
// 高精度加法函数
string addBigInt(string num1, string num2) {
// 1. 确保num1是较长的那个字符串,方便后续处理
if (num1.length() < num2.length()) {
swap(num1, num2);
}
// 2. 将两个字符串逆序,以便从个位开始计算
reverse(num1.begin(), num1.end());
reverse(num2.begin(), num2.end());
string result = “”; // 存储结果的字符串
int carry = 0; // 进位,初始为0
// 3. 遍历较长的数字
for (int i = 0; i < num1.length(); i++) {
// 将当前位转换为数字
int digit1 = num1[i] - ‘0’;
// 如果num2还有位,则转换,否则视为0
int digit2 = (i < num2.length()) ? (num2[i] - ‘0’) : 0;
// 当前位的总和(包括上一位的进位)
int sum = digit1 + digit2 + carry;
// 计算当前位的结果
int current_digit = sum % 10;
// 计算新的进位
carry = sum / 10;
// 将当前位的结果添加到结果字符串中
result.push_back(current_digit + ‘0’);
}
// 4. 处理最后可能剩余的进位
if (carry > 0) {
result.push_back(carry + ‘0’);
}
// 5. 将结果反转,得到正确的顺序
reverse(result.begin(), result.end());
return result;
}
int main() {
string a, b;
cout << "请输入第一个大数: ";
cin >> a;
cout << "请输入第二个大数: ";
cin >> b;
string sum = addBigInt(a, b);
cout << "它们的和是: " << sum << endl;
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

papership

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值