大数——大数加法
2017-04-29 21:38
183 查看
在算法比赛中,经常会遇到一些数据很大的数,如果需要计算,就得涉及大数运算的相关算法。
虽然用JAVA的大数类实现十分简单方便,但是对于C++的实现我觉得也是有必要去研究一下的,这样才能够对数学与计算机的结合有一个更深的认识。
首先整理一下大数加法
给两个数a和b,计算a+b的值,注意这里的a和b限制为超过整型大小,所以我们不能使用平时的“+”运算,只得另寻他法。
举个例子说明一下:
上面的字符数组a和字符数组b,进行每位的相加,然后得到字符数组c。
然后考虑字符数组c的每一位,如果大于9,则要进行进位操作,即这个数字的前一个地址的数加1,然后这个数减去10即可。
按照上面的思路再一次进行计算:
这样就是最后的结果了。
虽然用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; }
相关文章推荐
- 大数加法
- UVA 424-Integer Inquiry(大数加法)
- soj1002大数加法
- 大数加法,A+B
- 大数加法
- hdoj-1002 大数加法
- 大数加法 hdu 1002
- 大数加法乘法
- ACM 大数加法
- sdut2613(This is an A+B Problem)大数加法(乘法)
- 大数加法的实现
- ACM简单处理大数加法方法
- HDOJ1002大数加法
- POJ--1503:Integer Inquiry 大数加法
- 大数运算——加法减法
- 6.15奇特大数加法
- 大数加法(仅能处理正数)
- acm 总结之大数加法
- 大数,高精度计算---大数加法
- uva 465 - Overflow 大数加法 大数乘法