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.xdnf.cn/news/1486106.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】HTTP 协议

目录 1. URL2. HTTP 协议2.1. HTTP 请求2.2. HTTP 响应 1. URL URL 表示着是统一资源定位符(Uniform Resource Locator), 就是 web 地址&#xff0c;俗称“网址”; 每个有效的 URL 可以通过互联网访问唯一的资源, 是互联网上标准资源的地址; URL 的主要由四个部分组成: sche…

如何查看jvm资源占用情况

如何设置jar的内存 java -XX:MetaspaceSize256M -XX:MaxMetaspaceSize256M -XX:AlwaysPreTouch -XX:ReservedCodeCacheSize128m -XX:InitialCodeCacheSize128m -Xss512k -Xmx2g -Xms2g -XX:UseG1GC -XX:G1HeapRegionSize4M -jar your-application.jar以上配置为堆内存4G jar项…

广州邀请媒体宣传(附媒体名单)

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 广州地区 媒体邀约&#xff1a; 记者现场采访&#xff0c;电视台到场报道&#xff0c;展览展会宣传&#xff0c;广交会企业宣传&#xff0c;工厂探班&#xff0c;媒体专访等。 适合广州…

自监督学习在言语障碍及老年语音识别中的应用

近几十年来针对正常言语的自动语音识别&#xff08;ASR&#xff09;技术取得了快速进展&#xff0c;但准确识别言语障碍&#xff08;dysarthric&#xff09;和老年言语仍然是一项极具挑战性的任务。言语障碍是一种由多种运动控制疾病引起的常见言语障碍类型&#xff0c;包括脑瘫…

android studio中svn的使用

第一步&#xff0c;建立一个项目。 第二步&#xff0c;share project。 第三步&#xff0c;选择存放的位置&#xff0c;然后添加提交信息&#xff0c;最后点击share。这样就可以在svn上面看到一个空的项目名称。 第四步&#xff0c;看到文件变成了绿色&#xff0c;点击commit图…

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(三)基变换与坐标变换;微分方程;李群和李代数;雅可比矩阵

一、基变换与坐标变换 字小,事不小。 因为第一反应:坐标咋变,坐标轴就咋变呀。事实却与我们想象的相反。这俩互为逆矩阵。 第一次读没有读明白,后面到事上才明白。 起因是多传感器标定:多传感器,就代表了多个坐标系,多个基底。激光雷达和imu标定。这个标定程序,网上,…

Python机器学习入门:从理论到实践

文章目录 前言一、机器学习是什么&#xff1f;二、机器学习基本流程三、使用Python进行机器学习1.数据读取2.数据规范化3. 数据降维&#xff08;主成分分析&#xff09;4. 机器学习模型的选择5. 线性回归模型的实现6. 可视化结果 总结 前言 机器学习是人工智能的一个重要分支&…

pytorch 笔记:torch.optim.Adam

torch.optim.Adam 是一个实现 Adam 优化算法的类。Adam 是一个常用的梯度下降优化方法&#xff0c;特别适合处理大规模数据集和参数的深度学习模型 torch.optim.Adam(params, lr0.001, betas(0.9, 0.999), eps1e-08, weight_decay0, amsgradFalse, *, foreachNone, maximizeFa…

1小时上手Alibaba Sentinel流控安全组件

微服务的雪崩效应 假如我们开发了一套分布式应用系统&#xff0c;前端应用分别向A/H/I/P四个服务发起调用请求&#xff1a; 但随着时间推移&#xff0c;假如服务 I 因为优化问题&#xff0c;导致需要 20 秒才能返回响应&#xff0c;这就必然会导致20秒内该请求线程会一直处于阻…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第三十八章 驱动模块编译进内核

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

OpenAI从GPT-4V到GPT-4O,再到GPT-4OMini简介

OpenAI从GPT-4V到GPT-4O&#xff0c;再到GPT-4OMini简介 一、引言 在人工智能领域&#xff0c;OpenAI的GPT系列模型一直是自然语言处理的标杆。随着技术的不断进步&#xff0c;OpenAI推出了多个版本的GPT模型&#xff0c;包括视觉增强的GPT-4V&#xff08;GPT-4 with Vision&…

Sokit(TCP/UDP调试工具)

下载&#xff1a;http://www.winwin7.com/soft/56522.html#xiazai Sokit中文版是一款免费开源的TCP / UDP 测试&#xff08;调试&#xff09;工具&#xff0c;它主要可以用于接收和发送TCP/UDP数据包&#xff0c;让你更深的了解网络状况&#xff0c;能够有效地接收、发送、转…

Adobe国际认证详解-从零开始学做视频剪辑

从零开始学做视频剪辑&#xff0c;是许多初学者面临的挑战。在这个数字媒体时代&#xff0c;视频剪辑已经成为一种重要的技能&#xff0c;无论是个人爱好还是职业发展&#xff0c;掌握视频剪辑技能都是非常有价值的。 视频剪辑&#xff0c;简称“剪辑”&#xff0c;是视频制作过…

创建vue3项目,以及使用示例

1.在根目录下cmd&#xff1a;vue create myobj&#xff08;没有切换淘宝镜像记得切换&#xff0c;这样创建项目运行快&#xff09; 2. 3.(按空格键选中&#xff0c;选好回撤就到下一步了) 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.然后输入执行以下两步就已经运行项目了 以…

SpringMVC实现文件上传

导入文件上传相关依赖 <!--文件上传--> <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version> </dependency> <dependency><groupId>…

鱼眼摄像头-opencv校准(基于棋盘+畸变表)

一&#xff1a;主要参数说明 1&#xff1a;内参矩阵K 是3*3的矩阵&#xff0c;其类似格式 Knp.array([ [389.2109574522624, 0.0, 630.2525667489842], [0.0, 388.505701978078, 360.7886749292513], [0.0, 0.0, 1.0]]) 2&#xff1a;畸变系数 针对鱼眼相机&#xff1a;…

粘包问题、mmap和分片上传

一、粘包问题&#xff1a; 如果一端要把文件发给另一端&#xff0c;要发送两个部分的数据&#xff1a;其一是文件名&#xff0c;用于对端创建文件&#xff1b;另一个部分是文件内容。服务端在接收文件名&#xff0c;实际上并不知道有多长&#xff0c; 所以它会试图把网络缓冲区…

v-for 进行列表的 增删改查

通过对象下标替换属性值 但是通过实践此方法是错误的&#xff0c;Vue监听的是students这个对象&#xff0c;而不是这个对象里面的数组信息&#xff0c;也就是说&#xff0c;改变里面的值&#xff0c;并不能在页面上实现更新的功能 <!DOCTYPE html> <html lang"en…

Adobe国际认证详解-动漫制作专业就业方向和前景

动漫制作专业的就业方向和前景随着创意产业的蓬勃发展而愈发广阔。这一专业涵盖了从角色设计、场景绘制到动画制作、特效合成等多个环节&#xff0c;是创意与技术相结合的典型代表。随着数字媒体和互联网的普及&#xff0c;动漫制作专业人才的需求正不断增长&#xff0c;为该专…

c++ primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作

c primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作 c primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作 文章目录 c primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作16.3.3 对矢量可执行的其他操作…