当前位置: 首页 > news >正文

c++ 高精度加法(只支持正整数)

再给大家带来一篇高精度,不过这次是高精度加法!话不多说,开整!

声明

与之前那篇文章一样,如果看起来费劲可以结合总代码来看

定义

由于加法进位最多进1位,所以我们的结果ans[]的长度定义为两个加数中最长长度+1即可

所有变量声明、输入环节和初始化:

string j1,j2;//两个加数 
int l1=j1.length(),l2=j2.length();//两个加数的长度,确保只调用一次length()函数,节约时间 
int ans[max(l1,l2)+1],step=max(l1,l2);//ans[]为最终结果,step可以理解为ans的下标 
int t1,t2,jinWei=0,weiShu;//t1为j1中的一个数字,t2为j2中的一个数字 
cout<<"加数1:";//输入 
cin>>j1;
cout<<"加数2:";
cin>>j2;
for(int i=0;i<max(l1,l2);i++)ans[i]=0;

计算过程(思路)

本文以123456+127来举例,计算过程如下:

我们可以发现从j1[4]+j2[2] 开始,最后得到ans[4]=2;

也就是从两个加数的最后一位开始加,加的结果的个位与上一位的进位的和存入ans[]的最后一位中,然后推进到下一位,以此类推

计算过程(实现)

 由思路可以得出以下for循环:由于有j1的长度更长 j2的长度更长两个加数的长度相等三种情况,所以要分情况取本轮加数(-‘0’为char转int,详见c/c++ char和int互转)

for(int i=min(l1,l2)-1;i>=0;i--){if(l1>l2){//j1的长度更长t1=j1[i+(l1-l2)]-'0';//由于两个加数的长度有偏差,所以数组的下标也不相同(如j1[4]应与j2[2]相加),两个下标之差便是两个加数的长度之差t2=j2[i]-'0';}else if(l1<l2){//j2的长度更长 t1=j1[i]-'0';t2=j2[i+(l2-l1)]-'0';}else{//两个加数的长度相等 t1=j1[i]-'0';t2=j2[i]-'0';}ans[step--]=(t1+t2+jinWei)%10;//step--是因为ans中已经存入了一位数,(t1+t2+jinWei)%10即两数的第i位与上一步的进位相加的和的个位jinWei=(t1+t2+jinWei)/10;
}

以上的代码结束于示例中j1[2]+j1[0]存入ans[3]并保留jinWei=0的操作,此时还有j1[0]和j1[1]没有操作,对于这两位,仅仅需要从j1[1]开始倒退,用j1[1]加上一步的jinWei并存入ans[]中,刷新jinWei即可,如下,初始值为长度差-1(因为两个加数中长度更短的数已经加完了,没有操作的便是较长数剩下的部分,由于下标从0开始,就要-1) :这里又存在j1的长度更长j2的长度更长两种情况,所以要分情况取本轮加数,与上个for相似

for(int i=max(l1,l2)-min(l1,l2)-1;i>=0;i--){ if(l1>l2){//j1的长度更长 t1=j1[i]-'0';ans[step--]=(t1+jinWei)%10;//与上个for相似的操作 jinWei=(t1+jinWei)/10;}else if(l1<l2){//j2的长度更长t2=j2[i]-'0';ans[step--]=(t2+jinWei)%10;jinWei=(t2+jinWei)/10;}
}

ok,在运行完上面这段代码后,所有的位都处理完了,但是最后一轮的jinWei还没有处理,所以让ans[step]+=jinWei(也可以用ans[0]=jinWei,都是一样的)就处理完了整个计算过程:

ans[step]+=jinWei;

打印

因为计算后可能会出现最后一轮没有进位,就像上面举得那个例子一样,那么ans[0]就会是0,这种首位是0的情况当然是不打印为好,如此一来我们就要计算结果的位数(开头定义的weiShu):

//ans[]的最大位数为max(l1,l2)+1,没有进位(jinWei==0)时位数就为最大位数-1(因为首位为0),否则就是有进位,此时的位数为最大位数
if(jinWei==0)weiShu=max(l1,l2);
else weiShu=max(l1,l2)+1;

最后用一个for打印出来:起始值为最大位数减去weiShu,以此来确定起始值为0还是1

cout<<"和:";
for(int i=max(l1,l2)+1-weiShu;i<max(l1,l2)+1;i++)cout<<ans[i];
cout<<endl;

总代码

激动人心的时刻,准备好了吗?

#include<iostream>
using namespace std;
int main(){string j1,j2;//两个加数 int l1=j1.length(),l2=j2.length();//两个加数的长度,确保只调用一次length()函数,节约时间 int ans[max(l1,l2)+1],step=max(l1,l2);//ans[]为最终结果,step可以理解为ans的下标 int t1,t2,jinWei=0,weiShu;//t1为j1中的一个数字,t2为j2中的一个数字 cout<<"加数1:";//输入 cin>>j1;cout<<"加数2:";cin>>j2;for(int i=0;i<max(l1,l2);i++)ans[i]=0;for(int i=min(l1,l2)-1;i>=0;i--){if(l1>l2){//j1的长度更长 t1=j1[i+(l1-l2)]-'0';//由于两个加数的长度有偏差,所以数组的下标也不相同(如j1[4]应与j2[2]相加),两个下标之差便是两个加数的长度之差 t2=j2[i]-'0';}else if(l1<l2){//j2的长度更长 t1=j1[i]-'0';t2=j2[i+(l2-l1)]-'0';}else{//两个加数的长度相等 t1=j1[i]-'0';t2=j2[i]-'0';}ans[step--]=(t1+t2+jinWei)%10;//step--是因为ans中已经存入了一位数,(t1+t2+jinWei)%10即两数的第i位与上一步的进位相加的和的个位 jinWei=(t1+t2+jinWei)/10;}for(int i=max(l1,l2)-min(l1,l2)-1;i>=0;i--){ if(l1>l2){//j1的长度更长 t1=j1[i]-'0';ans[step--]=(t1+jinWei)%10;//与上个for相似的操作 jinWei=(t1+jinWei)/10;}else if(l1<l2){//j2的长度更长t2=j2[i]-'0';ans[step--]=(t2+jinWei)%10;jinWei=(t2+jinWei)/10;}}ans[step]+=jinWei;//ans[]的最大位数为max(l1,l2)+1,没有进位(jinWei==0)时位数就为最大位数-1(因为首位为0),否则就是有进位,此时的位数为最大位数if(jinWei==0)weiShu=max(l1,l2);else weiShu=max(l1,l2)+1;cout<<"和:";for(int i=max(l1,l2)+1-weiShu;i<max(l1,l2)+1;i++)cout<<ans[i];cout<<endl;
}

如有疑问或有办法将此代码变为支持所有数欢迎评论区留言或私信(支持所有数的我会尽快做好)

http://www.lryc.cn/news/405031.html

相关文章:

  • python键盘操作工具:ctypes、pyautogui
  • 计算机网络发展历史
  • 记录安装android studio踩的坑 win7系统
  • Python图形编程-PyGame快速入门
  • 邦芒宝典:8种方法调整职场心态
  • 华为OD2024D卷机试题汇总,含D量50%+,按算法分类刷题,事半功倍
  • Unity UGUI 之 Graphic Raycaster
  • 类和对象——相关的零碎知识
  • 【hadoop大数据集群 1】
  • TQSDRPI开发板教程:实现PL端的UDP回环与GPSDO
  • array.some() ==> 查找数组list中,是否有包含与当前currKey的值不一样的misId
  • 最简单的typora+gitee+picgo配置图床
  • 【黄啊码】GPT的相关名词解释
  • git stash 命令详解
  • txt格式单词导入有道词典生词本 (java代码方式)
  • 轨迹优化 | 基于ESDF的共轭梯度优化算法(附ROS C++/Python仿真)
  • 深入浅出WebRTC—ALR
  • BSV区块链技术现实应用原理解析
  • 七大基于比较的排序算法
  • web前端 React 框架面试200题(四)
  • 5.Fabric的共识机制
  • 【safari】react在safari浏览器中,遇到异步时间差的问题,导致状态没有及时更新到state,引起传参错误。如何解决
  • 京准:GPS北斗卫星授时信号安全隔离防护装置
  • 解决方案架构师系列 - AWS - Pinpoint
  • MF173:将多个工作表转换成PDF文件
  • Docker、containerd、CRI-O 和 runc 之间的区别
  • PRISM-Python 中的规则一个简单的 Python 规则感应系统
  • DB-GPT:LLM应用的集大成者
  • 汉明权重(Hamming Weight)(统计数据中1的个数)VP-SWAR算法
  • 基于 PyTorch 的模型瘦身三部曲:量化、剪枝和蒸馏,让模型更短小精悍!