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

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

声明

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

定义

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

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

cpp 复制代码
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来举例,计算过程如下:

我们可以发现从j14+j22 开始,最后得到ans4=2;

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

计算过程(实现)

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

cpp 复制代码
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;
}

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

cpp 复制代码
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还没有处理,所以让ansstep+=jinWei(也可以用ans0=jinWei,都是一样的)就处理完了整个计算过程:

cpp 复制代码
ans[step]+=jinWei;

打印

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

cpp 复制代码
//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

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

总代码

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

cpp 复制代码
#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;
}

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

相关推荐
程序员-珍1 分钟前
力扣 877. 石子游戏
算法·leetcode·游戏
Kina_C3 分钟前
HAProxy 负载均衡算法全解析:从静态轮询到一致性哈希的实战指南
linux·算法·负载均衡·哈希算法·haproxy
月光船幽幽19 分钟前
四层公理框架驱动AI健康诊断
人工智能·python·科技·算法·安全
zmzb010323 分钟前
C++课后习题训练记录Day176
开发语言·c++
王维同学26 分钟前
跨位数进程的映像、命令行与环境块读取
c++·windows·安全
Rabitebla28 分钟前
C++ STL 之 set 详解:从底层红黑树到实际应用
开发语言·数据结构·c++·算法·leetcode
liulilittle38 分钟前
无锁多生产者多消费者队列的工程实现剖析——算法、内存模型与性能
算法·多线程·并发·无锁·mpmc·lock-free
郝学胜-神的一滴42 分钟前
力扣 692:巧用小顶堆高效求解前K个高频单词
java·数据结构·python·程序人生·算法·leetcode·职场和发展
科学实验家1 小时前
贪心算法:分饼干
算法·贪心算法
誰能久伴不乏1 小时前
深入解析 C++ STL 底层原理:从设计哲学到内存收割机
c++·架构·stl