高精度计算(二)高精加

高精度加法……

高精加是高精中比较简单的一类

模拟小学一年级第二学期加法内容即可














就像这样

需要注意的地方数组倒序储存

因为无法预知加法结果的长度 如果正着存储会导致向前(向左)进位可能没有空间进位

所以最方便的方法就是倒着储存

举个荔枝

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。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值