Problem Description
I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B.
Input
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.
Output
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. Output a blank line between two test cases.
Sample Input
2
1 2
112233445566778899 998877665544332211
Sample Output
Case 1:
1 + 2 = 3
Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110
题解
题意:
- 大整数加法
思路:
- 我用的比较一般的方法,老老实实地从末位相加,进位。(看代码注释)
Code
#include<iostream>
#include<string>
#include<cstring>
#include<stack>
using namespace std;
char a[1005], b[1005];//将两个大整数当作字符串存入数组
stack <char> aa;
stack <char> bb;
stack <int> cc;
int main()
{
int la, lb, n, ret, num;
cin>>n;
for (int i = 1; i <= n; i++)
{
cin >> a >> b;
la = strlen(a);
lb = strlen(b);
ret = 0;
num = 0;
for (int j = 0; j < la; j++)//压栈,高位存在栈底
aa.push(a[j]);
for (int j = 0; j < lb; j++)
bb.push(b[j]);
while (!aa.empty() && !bb.empty())//两个数从低位逐位相加,ret为进位
{ //循环结束时,必有一个栈空
num = aa.top()- '0' + bb.top() - '0';
cc.push((num + ret) % 10);
ret = (num + ret) / 10;
aa.pop();
bb.pop();
}
while (!bb.empty())//将非空的栈里的元素继续处理为数字存入栈cc
{
num = bb.top() - '0';
cc.push((num + ret) % 10);
ret = (num + ret) / 10;
bb.pop();
}
while (!aa.empty())
{
num = aa.top() - '0';
cc.push((num + ret) % 10);
ret = (num + ret) / 10;
aa.pop();
}
if(ret != 0)//最后判断进位是否为0
cc.push(ret);
printf("Case %d:\n%s + %s = ", i, a, b);
while (!cc.empty())//高位后入栈,先输出
{
cout<<cc.top();
cc.pop();
}
printf("\n");
if(i != n)
printf("\n");
}
}