在ACM刷题中,处理大数问题,如大数加法,减法,乘法,除法,高精度计算,一般都用字符数组处理。
1.大数加法
处理方法:模拟两个数相加过程:从低位开始相加,有进位则做进位处理
两数相加过程:
但是处理过程并不完一样:具体方法:将两个大数分别存入两字符数组中,因为要处理进位问题,所以把两数颠倒之后放入两整型数组中去(最高位有进位时,如果不颠倒,处理起来会比较麻烦),然后从低位开始相加到高位,先不做进位问题,加完之后再进位,然后在把结果存入字符数组中
代码:
#include<stdio.h>
#include<string.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define max a>=b?a:b
int main()
{
char sa[400],sb[400],s[400]; //用来存放两个大数
int sum[400],lena,lenb,maxl,i,d;
scanf("%s %s",sa,sb);
mem(sum,0); //将数组sum清0
lena=strlen(sa);
lenb=strlen(sb);
maxl=max(lena,lenb);
for(i=lena-1;i>=0;i--)
sum[lena-1-i]=sa[i]-'0';
for(i=lenb-1;i>=0;i--)
sum[lenb-1-i]+=sb[i]-'0'; //把两大数从个位开始对应相加,先不做进位处理
for(i=0,d=0;i<maxl;i++) //进位初始化为0
{
sum[i]+=d;
d=sum[i]/10;
sum[i]%=10;
} //从个位开始处理进位
if(d>0) //如果最高位有进位
sum[maxl++]+=d;
for(i=maxl-1;i>=0;i--)
s[maxl-1-i]=sum[i]+'0'; // 结果存入字符数组s中
s[maxl]='\0';
printf("%s\n",s);
return 0;
}