C++利用string实现高精度加法运算
当数值超出标准整数类型的范围时,常规方法失效。本文详细解析如何通过 C++ 的 string 类型结合数组模拟思想,实现两个超大整数的精确相加。
设计思路与前置准备
对于极大整数的运算,直接使用 long long int 等原生数据类型会溢出。解决此问题的核心思路是:将数字以字符串形式存储,模拟人工竖式加法的过程,即从低位到高位逐位相加并处理进位。
关键步骤:
- 数据读取:输入的大整数直接作为
std::string存储。 - 对齐顺序:为了方便从“个位”开始计算,通常将字符串反转,使索引
0对应最低位。 - 核心运算:遍历公共长度部分,计算本位之和与新的进位值。
- 剩余处理:处理较长字符串剩余的位数,直至结束。
第1步:定义辅助函数(字符/整数互转)
在进行算术运算前,需要将字符型的 '0'-'9' 转换为对应的整数 int,计算完成后再转回字符型。
int charToInt(char c){
return c - '0'; // ASCII码相减得到实际数值}
char intToChar(int n){
return '0' + n; // 加上 '0' 的 ASCII 码恢复为字符}
第2步:字符串反转工具函数
由于 string 默认是正序存储(例如 "123"),而计算需要从末尾(3)开始,因此需要反转操作。以下代码演示了如何将字符串从头到尾插入到新字符串的前端。
string reverseStr(string input){
string output = "";
for(int i = 0; i < input.length(); i++){
output.insert(output.begin(),input[i]);
}
return output;
}
第3步:高精度加法核心逻辑
加法函数 sumofStr 负责执行实际的叠加逻辑。其工作流程如下:
参数接收与初始化: 接收两个原始字符串,并在内部进行反转操作以统一为从低位到高位的视角。设定 pMax 为两个字符串长度的最小值,用于循环计算公共部分;同时初始化进位标志 carry = 0。
string sumofStr(string _s1, string _s2){
string s1 = reverseStr(_s1);
string s2 = reverseStr(_s2);
// 获取较短的长度作为公共部分的边界
int pMax = s1.length() > s2.length() ? s2.length() : s1.length();
string sumStr = "";
int carry = 0; // 进位
int temp = 0;
// 1. 处理两个数共有的低位部分
for(int p = 0; p < pMax; p++){
temp = charToInt(s1[p]) + charToInt(s2[p]) + carry;
carry = temp / 10; // 更新进位值
sumStr.insert(sumStr.begin(),intToChar(temp % 10)); // 当前位结果插入头部
}
// 2. 处理 s1 多出的高位部分
if(p < s1.length()){
for(; p < s1.length(); p++){
temp = charToInt(s1[p]) + carry;
carry = temp / 10;
sumStr.insert(sumStr.begin(),intToChar(temp % 10));
}
}
// 3. 处理 s2 多出的高位部分
if(p < s2.length()){
for(; p < s2.length(); p++){
temp = charToInt(s2[p]) + carry;
carry = temp / 10;
sumStr.insert(sumStr.begin(),intToChar(temp % 10));
}
}
// 4. 如果最后还有进位,追加最高位
if(carry > 0){
sumStr.insert(sumStr.begin(),intToChar(carry));
}
return sumStr;
}
总结
上述算法通过字符串倒序和对齐累加的方式,完美避开了原生数据类型的溢出限制。该实现涵盖了从预处理、公共位计算到余量补全的所有环节,是学习 C++ 基础算法与实际工程应用结合的典型案例。
以上就是使用C++的string实现高精度加法运算的详细内容,更多关于C++高精度算法的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













