原理
大数运算的原理其实就是模拟人工计算(注记:再考虑是否有其他算法。注记日期:2017.3.19),人工加法计算步骤如下:
1.将两个操作数(operand)位数对齐。
2.从最低位开始,计算两个操作数每位的总和再加上进位数(第一位数为0)的结果,保留其个位数。
3.若上述的结果大于10,进位数置为1,否则为0。(每位数相加的结果不会超过 9 + 9 = 18 , 因此进位数只有1和0)
4.重复上述步骤2、3,直到计算完两个操作数其中那个位数小的最高位。
我们来看一道例题:
A+B Problem II
时间限制:
3000 ms | 内存限制:
65535 KB 难度:
3
- 描述
I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B.
A,B must be positive.
- 输入
- The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line consists of two positive integers, A and B. Notice that the integers are very large, that means you should not process them by using 32-bit integer. You may assume the length of each integer will not exceed 1000.
- 输出
- For each test case, you should output two lines. The first line is “Case #:”, # means the number of the test case. The second line is the an equation “A + B = Sum”, Sum means the result of A + B. Note there are some spaces int the equation.
- 样例输入
2 1 2 112233445566778899 998877665544332211
- 样例输出
Case 1: 1 + 2 = 3 Case 2: 112233445566778899 + 998877665544332211 = 1111111111111111110
-
- 注意:此题有一个细节问题就是高位不能为0,举个例子012+011不能等于033,而结果为33
- 现在我们来看一下代码的实现:
-
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define MAX 1010 using namespace std; char str1[MAX],str2[MAX]; int a[MAX],b[MAX],c[MAX]; int main() { int t; int kase=0; cin>>t; while(t--) { memset(a,0,sizeof(a));//对数组初始化 memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); cin>>str1>>str2; printf("Case %d:\n",++kase); printf("%s + %s = ",str1,str2); int len1=strlen(str1); int len2=strlen(str2); for(int i=len1-1,j=0;i>=0;i--) { a[j++]=str1[i]-'0'; } for(int i=len2-1,j=0;i>=0;i--) { b[j++]=str2[i]-'0'; } for(int i=0;i<MAX;i++) { c[i]+=a[i]+b[i]; if(c[i]>=10) { c[i]=c[i]%10;//满十进一 c[i+1]++; } } int j; for(j=MAX-1;c[j]==0;j--);//避免高位等于0 if(j<0) cout<<0; else { for(;j>=0;j--) cout<<c[j]; } cout<<endl; } return 0; }