您的位置:首页 > 其它

大数——大数加法

2017-04-29 21:38 183 查看
在算法比赛中,经常会遇到一些数据很大的数,如果需要计算,就得涉及大数运算的相关算法。

虽然用JAVA的大数类实现十分简单方便,但是对于C++的实现我觉得也是有必要去研究一下的,这样才能够对数学与计算机的结合有一个更深的认识。

首先整理一下大数加法

大数加法

问题描述:

给两个数a和b,计算a+b的值,注意这里的a和b限制为超过整型大小,所以我们不能使用平时的“+”运算,只得另寻他法。

分析

使用字符数组来保存a和b,并进行字符数组的操作。按照我们平时的手算进行模拟即可。

举个例子说明一下:

a=    1  2  3  4  5  6  7  8  9  1  0  1  1  1  2  1  3
b= 2  3  4  5  6  7  8  9  1  0  1  1  1  2  1  3  1  4
—————————————————————————————————————————————————————————
c= 2  4  6  8  10 12 14 16 9  9  2  1  2  3  2  5  2  7


上面的字符数组a和字符数组b,进行每位的相加,然后得到字符数组c。

然后考虑字符数组c的每一位,如果大于9,则要进行进位操作,即这个数字的前一个地址的数加1,然后这个数减去10即可。

按照上面的思路再一次进行计算:

a=    1  2  3  4  5  6  7  8  9  1  0  1  1  1  2  1  3
b= 2  3  4  5  6  7  8  9  1  0  1  1  1  2  1  3  1  4
—————————————————————————————————————————————————————————
c= 2  4  6  9  1  3  5  6  9  9  2  1  2  3  2  5  2  7


这样就是最后的结果了。

#include<cstdio>
#include<cstring>
const int maxn = 1000+10;
char a[maxn], b[maxn];

void BigInteger_Add(char *a, char *b)
{
//先进行每位的相加
for(int i=strlen(a)-1, j=strlen(b)-1; j>=0; j--, i--)
{
a[i] = a[i]+b[j]-'0';
}
for(int i=strlen(a)-1; i>0; i--)
{
//每位进行判断是否大于9,如果大于则进位,自身减10
if(a[i] > '9')
{
a[i-1]++;

4000
a[i] = a[i]-10;
}
}
//最后判断一下首位的数是否大于9
if(a[0]>'9')
{
a[0] -= 10;
printf("1");
}
printf("%s",a);
return;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s%s",a,b);
if(strlen(a) > strlen(b))
{
BigInteger_Add(a,b);
}else BigInteger_Add(b,a);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: