当前位置: 代码迷 >> 综合 >> swust oj题解#15 A+B Plus(高精通加法)
  详细解决方案

swust oj题解#15 A+B Plus(高精通加法)

热度:87   发布时间:2023-12-05 17:47:32.0

目录

题目

思路解析

代码实现


题目

输入两个数a,b,计算a+b(定义范围超过long long)

思路解析

这个题,本质还是加法,我们小学就都知道,加法就是做竖式运算。

例如:        19827+    333
————————————————=  20160

定义范围超过long long。那就只能用字符串来输入了。

由于字符相加,比如'4'+'9'结果并非13,而是字符'm'(ASCII表)

因此,我们需要把字符转换为数字,并且存在数组中

scanf("%s %s",a1,a2);
//统计长度
//定义len3为两串数字的长度之差,max为最大长度。
int len1=strlen(a1),len2=strlen(a2),len3,max;
if(len1>len2)
{len3=len1-len2;max=len1;
}
else
{len3=len2-len1;max=len2;
}
//将字符串转换为数字并存入数组中。
//数字字符减去'0',即转化为对应的数字。
if(len1>len2)
{for(int i=1;i<=max;i++) b1[i]=a1[i-1]-'0';for(int i=1+len3;i<=max;i++) b2[i]=a2[i-len3-1]-'0';
}
else
{for(int i=1+len3;i<=max;i++) b1[i]=a1[i-len3-1]-'0';for(int i=1;i<=max;i++) b2[i]=a2[i-1]-'0';
}

由于原理是《竖式运算》,因此存入数组中必须为从i=1开始(为了进满十进位)。

并且,短的数串,从中间开始赋值,这样才能对齐并相加。

还是刚才的例子:19827+333,以及67+45=112。

对齐之后
实际效果为:        019827        067+   000333     +  045
———————————————    ———————=   020160     =  112

看到这里,肯定有小伙伴会问:为什么这么麻烦,不直接输入在数组中呢?因为输入一个数,

它不一定是1位数,可以是多位数。举个例子:输入用数组定义的8888,

电脑是无法识别a[0]是8还是88还是888......。而字符就不一样,字符则是单个数了

用字符输入1234,则a[0]为1,a[1]为2,a[2]为3,a[3]为4。

基本结构搭建完了,接下来就是相加了。

然后,这道题的难点其实也就在于满十进位,如9+4=13,甚至于连续的进位,如999+2=1001。

//从个位数开始,因此要倒着相加。
for(int i=max;i>0;i--)
{//相加,这里一定要+=//如果是=,那么之前的进位就白费了。plus[i]+=b1[i]+b2[i];//大于10,进行进位。 if(plus[i]>=10){plus[i]-=10;plus[i-1]++;}
}

相加做完了,接下来就是输出了

if的判断机制是if(true)则执行,if(false)则不执行,而电脑会默认false为0,因此当plus[0]==0时候

if(plus[0])也就是if(false),也就不会执行了。

if(plus[0]) for(int i=0;i<=max;i++) printf("%d",plus[i]);
else        for(int i=1;i<=max;i++) printf("%d",plus[i]);
printf("\n");

代码实现

#include <bits/stdc++.h> 
char a1[100005],a2[100005];
int  b1[100005]={0},b2[100005]={0};
int plus[100005]={0};
int main()
{scanf("%s %s",a1,a2);int len1=strlen(a1),len2=strlen(a2),len3,max;if(len1>len2){len3=len1-len2;max=len1;}else{len3=len2-len1;max=len2;}if(len1>len2){for(int i=1;i<=max;i++) b1[i]=a1[i-1]-'0';for(int i=1+len3;i<=max;i++) b2[i]=a2[i-len3-1]-'0';}else{for(int i=1+len3;i<=max;i++) b1[i]=a1[i-len3-1]-'0';for(int i=1;i<=max;i++) b2[i]=a2[i-1]-'0';}for(int i=max;i>0;i--){plus[i]+=b1[i]+b2[i];if(plus[i]>=10){plus[i]-=10;plus[i-1]++;}}if(plus[0]) for(int i=0;i<=max;i++) printf("%d",plus[i]);else        for(int i=1;i<=max;i++) printf("%d",plus[i]);printf("\n");return 0;
}

几个月之后的更新版本 

string HighProAdd(string num1,string num2) {if(num1.size()<num2.size()) swap(num1,num2);int a[100000],b[100000];for(int i=1;i<=num1.size();i++) a[i]=num1[num1.size()-i]-'0';for(int i=1;i<=num2.size();i++) b[i]=num2[num2.size()-i]-'0';for(int i=1;i<=num1.size();i++) {a[i]+=b[i];if(a[i]>9) {a[i+1]+=a[i]/10;a[i]%=10;}}string add="";if(a[num1.size()+1]==0) for(int i=num1.size();i>=1;i--) add+=a[i]+'0';if(a[num1.size()+1]==1) for(int i=num1.size()+1;i>=1;i--) add+=a[i]+'0';return add;
}