高精度加法……
高精加是高精中比较简单的一类
模拟小学一年级第二学期加法内容即可
就像这样
需要注意的地方数组倒序储存
因为无法预知加法结果的长度 如果正着存储会导致向前(向左)进位可能没有空间进位
所以最方便的方法就是倒着储存
再举个荔枝:
99 + 12
先读入 后处理
3 2 1
9 9
1 2 就是
1:9+2向左进位然后此位留下(9 + 2) % 10 = 1再算
2:9 + 1 再加上刚刚进的1 也就是9 + 1 + 1 继续进位 留下(9 + 1 + 1) % 10 = 1
这时候发现有效位数已经处理完 但是还有(9 + 1 + 1) / 10的余数x不为0 好的进一位
得到有效位数3: 留下1 % 10 = 1
得到答案111
上面的模拟中容易发现a位数的数+b位数的数可能是max(la,lb)或是max(la,lb)+1
所以实现的时候不妨设答案长度为max(la,lb) 如果有效位数处理完之后余数不为0
那么可以len++(因为我们是倒着储存的)再把余数存到ans[len]中
核心代码
1.初始化
使用字符串读入 如scanf("%d",s);或scanf("%d",s+1);
la = strlen(s); 或 la = strlen(s+1);
利用for(int i=1;i<=la;i++)n1[la-i+1] = s[i]-'0';来实现对数字的倒序储存(习惯从 1 开始)
2.模拟加法
注释很详细
int add(int a[],int la,int b[],int lb,int c[])
//这里传进去的参数比较多 主要是方便运算
{
int l=max(la,lb),x=0;
//l为答案的长度,x是余数
for(int i=1;i<=l;i++){
c[i]=a[i]+b[i]+x;//竖式上下加上小下标
x=c[i]/10;//计算进位
c[i]%=10;//计算留下来的
}
if(x!=0)c[++l]=x;//长度需要加1
return l;//返回答案的长度 便于输出答案
}
调用:int len = add( a , la , b , lb , ans );
3.输出
for(int i = len ;i >= 1;i--)
printf("%d" ,ans[i]);
欢迎指出Bug
End。