高精度加法

在做题目的过程中,我们经常会遇到一些题目的数据让我们难堪:数据过大造成我们的数据范围超出限制(Python啥的当我没说)。这时我们就需要想一种方法让我们能够对数据进行操作。此处以加法为例(不考虑负数)。

 c++中int类型最大能够存储的数是2147483647,这里的a和b都远远地大于int(long long也装不下),那我们首先得想一种办法能够将这些数据存储下来,很自然的可以想到可以用字符串来存储,那这样存储数据的问题就已经解决了。

但这样存储的是俩个字符串,也没法运算啊,该怎么办呢?

这个问题我们可以拆分成几个部分:

1.字符串无法直接像数字一样直接进行运算,那我们得先将字符串转换为数字,可数字无法直接存储,我们该如何解决?

我们可以将字符串的每一位字符分别转换成数字存储到数组之中。

转换的方法也很简单,我们只需对照ascll码将每一位字符减去字符‘0’的ascll码即可将这意味转换,

char c[1000]; //字符串c
int a[1000];//数字

//将c[i]转换成数字存到a[i]
a[i]=(int)c[i]-'0';

2.我们已经将字符串转换成了数字存储到了数组之中,我们应该如何进行加法运算?

这我们就需要掏出我们小学学的东西:竖式加法运算(就下面这玩意)

 

我们只需要将每一位数字单独出来考虑(考虑完再到下一位)即可 

以上面的个位和十位为例:8+7=15 15>10需要进位,我们将要进位记录下来,再将15-10=5,所以个位上填5,十位上,4+7=11,前面个位有进位,所以我们将11+1=12   12>10需要进位,我们将要进位记录下来,再将12-10=2,所以十位上填2

int a[1001],b[1001],ans[1001];
ans[l3]=a1[l]+b1[l]+carry;//ans存储运算完的数字
carry=0;//carry为进位的数
if (ans[l3]>=10)//判断是否进位
{
	carry=1;
	ans[l3]-=10;
}

3.我们输入的两个字符串可能长度并不相同转换到数组中数组长度也不相同,那我们如何处理?

 第一个办法:我们可以往较短的那个字符串前面添加若干个‘0’使得两个字符串长度相同。

第二个办法:当当前数位上某一个数组已经不存在数字,可以直接不考虑当前数组。

完整的代码:

#include<bits/stdc++.h>
using namespace std;
string a,b;
int ans[1001],a1[1001],b1[1001],carry=0;
int main()
{
	cin>>a;
	cin>>b;
	int l1=a.length(),l2=b.length(),l3=0;
	if (l1<=l2)
		for (int i=l1;i<l2;i++) a="0"+a;
	else
		for (int i=l2;i<l1;i++) b="0"+b;
	int l=a.length()-1;
	for (int i=0;i<=l;i++)
		a1[i]=(int)a[i]-'0';
	for (int i=0;i<=l;i++)
		b1[i]=(int)b[i]-'0';	
	while (l>=0)
	{
		l3++;
		ans[l3]=a1[l]+b1[l]+carry;
		carry=0;
		if (ans[l3]>=10)
		{
			carry=1;
			ans[l3]-=10;
		}
		l--;
	}
	if (carry==1) 
	{
		l3++;
		ans[l3]=1;
	} 
	for (int i=l3;i>=1;i--)
		printf("%d",ans[i]);
}

(记得考虑最高位进位)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值