拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

高精度模拟加法减法

高精度模拟加法减法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

高精度模拟加法减法

  • 前言
  • 一、高精度加法的实现
  • 二、高精度减法的实现
    • 1.
  • 总结
    • 1、比如减法实现里面的删除前导零没有考虑到结果全是零的情况
    • 2、减法实现里没有实现带有前导零的输入的处理

前言

大一新生学习 C++ 算法,记录自己的学习过程。
想要做一些内容输出来提高自己,这个内容是关于超出内存范围的高精度加法模拟。

一、高精度加法的实现

stringadd(string x,string y){string res;// res储存最后返回的答案intcarry=0;// carry储存进位intlen=max(x.size(),y.size());// 获取两个字符串中最长的长度for(inti=0;i<len;i++){if(carry==0)// 如果没有进位就在末位加0res.push_back('0');intxi,yi;// xi,yi代表当前对齐的if((int)x.size()-1-i<0)// 判断是否超过了最高位xi=0;elsexi=x[x.size()-1-i]-'0';// 没超过的话就获取该位的数字// 字符转数字要减去'0'if((int)y.size()-1-i<0)// 判断是否超过了最高位yi=0;elseyi=y[y.size()-1-i]-'0';// 同理intsum=xi+yi+carry;// 当前位次的加法是当下位置的数字之和res[i]=sum%10+'0';// 加上位置的进位 第一位置的进位设置为0carry=sum/10;// 总和除以10就是进位的数字if(carry!=0)// 如果进位了就在后面加上进位的数字res.push_back(carry+'0');}reverse(res.begin(),res.end());// 由于这个模拟是倒着储存的 (如s[0]存的是个位数)returnres;// 所以反转字符串 最后输出}

二、高精度减法的实现

1.

stringsub(string x,string y){boolok=true;// 标记结果的正负string res,s;// res 储存最后返回的答案intlen=max(x.size(),y.size());// 获取最长if(x.size()==y.size())// 保证 x 为大{for(inti=0;i<len;i++){if(x[i]>y[i]){break;}if(x[i]<y[i]){s=x;x=y;y=s;ok=false;// 如果 x 不为大标记为负数break;}}}elseif(x.size()<y.size()){s=x;x=y;y=s;ok=false;// 如果 x 不为大标记为负数}intcarry=0;// 获取借位for(inti=0;i<len;i++){res.push_back('0');// 加法会进位,但是减法不会intxi,yi;if((int)x.size()-1-i<0)xi=0;elsexi=x[x.size()-1-i]-'0';if((int)y.size()-1-i<0)yi=0;elseyi=y[y.size()-1-i]-'0';intsum=xi-yi+carry;res[i]=(sum+10)%10+'0';// 保证是正数carry=(sum-9)/10;}for(inti=len-1;i>0;i--)// 减法会导致前导零,我们去除它们,让 i > 0{// 也就是到 i = 1 是为了保留最后一个零(这个地方我漏掉了,是 AI 帮助我补全的)if(res[i]=='0')res.pop_back();elsebreak;}reverse(res.begin(),res.end());// 同理是由个位到高位的储存,反转字符串if(ok==false)res='-'+res;returnres;}

总结

这是我关于高精度模拟的学习记录,还有很多不足。

1、比如减法实现里面的删除前导零没有考虑到结果全是零的情况

2、减法实现里没有实现带有前导零的输入的处理

感觉实现起来有些许繁琐,希望可以在编程学习方面越走越远吧。
然后每天都发一些学习的内容做内容输出来提升自己和鞭策自己学习(bushi

返回列表