网站不备案可以做百度竞价吗,wordpress 注册邮箱,网站制作方案有哪些,建立公司官网再给大家带来一篇高精度#xff0c;不过这次是高精度加法#xff01;话不多说#xff0c;开整#xff01;
声明
与之前那篇文章一样#xff0c;如果看起来费劲可以结合总代码来看
定义
由于加法进位最多进1位#xff0c;所以我们的结果ans[]的长度定义为两个加数中最…再给大家带来一篇高精度不过这次是高精度加法话不多说开整
声明
与之前那篇文章一样如果看起来费劲可以结合总代码来看
定义
由于加法进位最多进1位所以我们的结果ans[]的长度定义为两个加数中最长长度1即可
所有变量声明、输入环节和初始化
string j1,j2;//两个加数
int l1j1.length(),l2j2.length();//两个加数的长度确保只调用一次length()函数节约时间
int ans[max(l1,l2)1],stepmax(l1,l2);//ans[]为最终结果step可以理解为ans的下标
int t1,t2,jinWei0,weiShu;//t1为j1中的一个数字t2为j2中的一个数字
cout加数1;//输入
cinj1;
cout加数2;
cinj2;
for(int i0;imax(l1,l2);i)ans[i]0;
计算过程思路
本文以123456127来举例计算过程如下 我们可以发现从j1[4]j2[2] 开始最后得到ans[4]2
也就是从两个加数的最后一位开始加加的结果的个位与上一位的进位的和存入ans[]的最后一位中然后推进到下一位以此类推
计算过程实现 由思路可以得出以下for循环由于有j1的长度更长 、j2的长度更长和两个加数的长度相等三种情况所以要分情况取本轮加数-‘0’为char转int详见c/c char和int互转
for(int imin(l1,l2)-1;i0;i--){if(l1l2){//j1的长度更长t1j1[i(l1-l2)]-0;//由于两个加数的长度有偏差所以数组的下标也不相同如j1[4]应与j2[2]相加两个下标之差便是两个加数的长度之差t2j2[i]-0;}else if(l1l2){//j2的长度更长 t1j1[i]-0;t2j2[i(l2-l1)]-0;}else{//两个加数的长度相等 t1j1[i]-0;t2j2[i]-0;}ans[step--](t1t2jinWei)%10;//step--是因为ans中已经存入了一位数(t1t2jinWei)%10即两数的第i位与上一步的进位相加的和的个位jinWei(t1t2jinWei)/10;
}
以上的代码结束于示例中j1[2]j1[0]存入ans[3]并保留jinWei0的操作此时还有j1[0]和j1[1]没有操作对于这两位仅仅需要从j1[1]开始倒退用j1[1]加上一步的jinWei并存入ans[]中刷新jinWei即可如下初始值为长度差-1因为两个加数中长度更短的数已经加完了没有操作的便是较长数剩下的部分由于下标从0开始就要-1 这里又存在j1的长度更长 、j2的长度更长两种情况所以要分情况取本轮加数与上个for相似
for(int imax(l1,l2)-min(l1,l2)-1;i0;i--){ if(l1l2){//j1的长度更长 t1j1[i]-0;ans[step--](t1jinWei)%10;//与上个for相似的操作 jinWei(t1jinWei)/10;}else if(l1l2){//j2的长度更长t2j2[i]-0;ans[step--](t2jinWei)%10;jinWei(t2jinWei)/10;}
}
ok在运行完上面这段代码后所有的位都处理完了但是最后一轮的jinWei还没有处理所以让ans[step]jinWei也可以用ans[0]jinWei都是一样的就处理完了整个计算过程
ans[step]jinWei;
打印
因为计算后可能会出现最后一轮没有进位就像上面举得那个例子一样那么ans[0]就会是0这种首位是0的情况当然是不打印为好如此一来我们就要计算结果的位数开头定义的weiShu
//ans[]的最大位数为max(l1,l2)1没有进位jinWei0时位数就为最大位数-1因为首位为0否则就是有进位此时的位数为最大位数
if(jinWei0)weiShumax(l1,l2);
else weiShumax(l1,l2)1;
最后用一个for打印出来起始值为最大位数减去weiShu以此来确定起始值为0还是1
cout和;
for(int imax(l1,l2)1-weiShu;imax(l1,l2)1;i)coutans[i];
coutendl;
总代码
激动人心的时刻准备好了吗
#includeiostream
using namespace std;
int main(){string j1,j2;//两个加数 int l1j1.length(),l2j2.length();//两个加数的长度确保只调用一次length()函数节约时间 int ans[max(l1,l2)1],stepmax(l1,l2);//ans[]为最终结果step可以理解为ans的下标 int t1,t2,jinWei0,weiShu;//t1为j1中的一个数字t2为j2中的一个数字 cout加数1;//输入 cinj1;cout加数2;cinj2;for(int i0;imax(l1,l2);i)ans[i]0;for(int imin(l1,l2)-1;i0;i--){if(l1l2){//j1的长度更长 t1j1[i(l1-l2)]-0;//由于两个加数的长度有偏差所以数组的下标也不相同如j1[4]应与j2[2]相加两个下标之差便是两个加数的长度之差 t2j2[i]-0;}else if(l1l2){//j2的长度更长 t1j1[i]-0;t2j2[i(l2-l1)]-0;}else{//两个加数的长度相等 t1j1[i]-0;t2j2[i]-0;}ans[step--](t1t2jinWei)%10;//step--是因为ans中已经存入了一位数(t1t2jinWei)%10即两数的第i位与上一步的进位相加的和的个位 jinWei(t1t2jinWei)/10;}for(int imax(l1,l2)-min(l1,l2)-1;i0;i--){ if(l1l2){//j1的长度更长 t1j1[i]-0;ans[step--](t1jinWei)%10;//与上个for相似的操作 jinWei(t1jinWei)/10;}else if(l1l2){//j2的长度更长t2j2[i]-0;ans[step--](t2jinWei)%10;jinWei(t2jinWei)/10;}}ans[step]jinWei;//ans[]的最大位数为max(l1,l2)1没有进位jinWei0时位数就为最大位数-1因为首位为0否则就是有进位此时的位数为最大位数if(jinWei0)weiShumax(l1,l2);else weiShumax(l1,l2)1;cout和;for(int imax(l1,l2)1-weiShu;imax(l1,l2)1;i)coutans[i];coutendl;
}
如有疑问或有办法将此代码变为支持所有数欢迎评论区留言或私信支持所有数的我会尽快做好