高精度模拟加法减法

发布时间:2026/10/5 12:59:07
高精度模拟加法减法 提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档高精度模拟加法减法前言一、高精度加法的实现二、高精度减法的实现1.总结1、比如减法实现里面的删除前导零没有考虑到结果全是零的情况2、减法实现里没有实现带有前导零的输入的处理前言大一新生学习 C 算法记录自己的学习过程。想要做一些内容输出来提高自己这个内容是关于超出内存范围的高精度加法模拟。一、高精度加法的实现stringadd(string x,string y){string res;// res储存最后返回的答案intcarry0;// carry储存进位intlenmax(x.size(),y.size());// 获取两个字符串中最长的长度for(inti0;ilen;i){if(carry0)// 如果没有进位就在末位加0res.push_back(0);intxi,yi;// xi,yi代表当前对齐的if((int)x.size()-1-i0)// 判断是否超过了最高位xi0;elsexix[x.size()-1-i]-0;// 没超过的话就获取该位的数字// 字符转数字要减去0if((int)y.size()-1-i0)// 判断是否超过了最高位yi0;elseyiy[y.size()-1-i]-0;// 同理intsumxiyicarry;// 当前位次的加法是当下位置的数字之和res[i]sum%100;// 加上位置的进位 第一位置的进位设置为0carrysum/10;// 总和除以10就是进位的数字if(carry!0)// 如果进位了就在后面加上进位的数字res.push_back(carry0);}reverse(res.begin(),res.end());// 由于这个模拟是倒着储存的 (如s[0]存的是个位数)returnres;// 所以反转字符串 最后输出}二、高精度减法的实现1.stringsub(string x,string y){booloktrue;// 标记结果的正负string res,s;// res 储存最后返回的答案intlenmax(x.size(),y.size());// 获取最长if(x.size()y.size())// 保证 x 为大{for(inti0;ilen;i){if(x[i]y[i]){break;}if(x[i]y[i]){sx;xy;ys;okfalse;// 如果 x 不为大标记为负数break;}}}elseif(x.size()y.size()){sx;xy;ys;okfalse;// 如果 x 不为大标记为负数}intcarry0;// 获取借位for(inti0;ilen;i){res.push_back(0);// 加法会进位但是减法不会intxi,yi;if((int)x.size()-1-i0)xi0;elsexix[x.size()-1-i]-0;if((int)y.size()-1-i0)yi0;elseyiy[y.size()-1-i]-0;intsumxi-yicarry;res[i](sum10)%100;// 保证是正数carry(sum-9)/10;}for(intilen-1;i0;i--)// 减法会导致前导零我们去除它们让 i 0{// 也就是到 i 1 是为了保留最后一个零这个地方我漏掉了是 AI 帮助我补全的if(res[i]0)res.pop_back();elsebreak;}reverse(res.begin(),res.end());// 同理是由个位到高位的储存反转字符串if(okfalse)res-res;returnres;}总结这是我关于高精度模拟的学习记录还有很多不足。1、比如减法实现里面的删除前导零没有考虑到结果全是零的情况2、减法实现里没有实现带有前导零的输入的处理感觉实现起来有些许繁琐希望可以在编程学习方面越走越远吧。然后每天都发一些学习的内容做内容输出来提升自己和鞭策自己学习bushi