目录
题目
思路解析
代码实现
题目
输入两个数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;
}