ACwing 791.高精度加法(附代码以及注释)

        

        今天整理一下高精度加法,顺便讲一下原理。

        由于数据大小的限制当遇到特别大的两个数相加时,程序会出现问题,内存溢出从而导致无法获得正确结果。因此我们就需要把一个很大数字变成一个string类型的字符串,然后拆开来,拆成单个字符,再一位一位进行计算。(小学加法的方式)

        举个简单的栗子:当12+23的时候,我们小学的方式是一位一位加先 2+3=5 ,再 1+2=3

然后两个并起来得到答案35。这个是没有进位的情况。

        当有进位的时候:例如36+79。用同样的方法,6+9=15 ,然后15取余得5填入当位,然后1进到下一位并带入计算。下一位计算就是7+3+1得到11,对11取余得1,填入当位。以及加完了但是,还有一个1,那么就在结果前再进一位。得到答案 1 1 5。

        注意:计算的时候我们是从最后面(也就是最低位)开始的,所以需要一步逆序

        之后我们把以上思路用代码实现,就如下:

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;//定义一个常量
vector<int>add(vector<int>& A, vector<int>& B) {
	vector<int>c;//定义动态整形数组c
	int t = 0;//t为余项
	for (int i = 0; i < A.size() || i < B.size(); i++) {
		if (i < A.size()) t += A[i];//如果A数组还有数字就加上
		if (i < B.size()) t += B[i];//如果B数组还有数字就加上
		c.push_back(t % 10);//取余数
		t /= 10;//t整除10,作为进项
	}
	if (t) c.push_back(1);//如果最后结束了,t还有,就再进1
	return c;//返回c数组
}
int main() {
	string a, b;//定义a,b为字符串
	vector<int> A, B;//定义动态整形数组A,B
	cin >> a >> b;
	for (int i = a.size() - 1; i >= 0; i--) {
		A.push_back(a[i] - '0');//将a字符串逆序赋值给A数组(注意这里(a[i]-'0')将数字字母转化为数字(原理为用a[i]的ASCII码值减去0的ASCII码值)
	}
	for (int i = b.size() - 1; i >= 0; i--) {
		B.push_back(b[i] - '0');//操作同上
	}
	auto C = add(A, B);//进行处理
	for (int i = C.size() - 1; i >= 0; i--) cout << C[i];//输出
	return 0;
}

        下篇预告:高精度乘法。

        还恳请各位大佬多指点指点这个蒟蒻牛~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值