hnust 1032: A + B Problem II
题目描述
I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B.
输入
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 in the equation. Output a blank line between two adjacent test cases.
样例输入 Copy
4
1 2
112233445566778899 998877665544332211
998 2
4568 0012
样例输出 Copy
Case 1:
1 + 2 = 3
Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110
Case 3:
998 + 2 = 1000
Case 4:
4568 + 0012 = 4580
题目描述
我有一个非常简单的问题要问你。给定两个整数 A 和 B,您的工作是计算 A + B 的总和。
输入
输入的第一行包含一个整数 T(1<=T<=20),表示测试用例的数量。然后是 T 行,每行由两个正整数 A 和 B 组成。 请注意,整数非常大,这意味着您不应该使用 32 位整数来处理它们。您可以假设每个整数的长度不会超过 1000。
输出
对于每个测试用例,您应输出两行。第一行是“Case #:”,#表示测试用例的编号。第二行是方程“A + B = Sum”,Sum 表示 A + B 的结果。在两个相邻之间输出一个空行 测试用例。
解题过程
这道题要用到高精度加法,用字符串代替数字计算
下面是对代码的详细解析:
-
头文件和命名空间:
- 包含
<iostream>
、<stack>
和<cstring>
头文件,分别用于输入输出、栈操作和字符串操作。 - 使用
using namespace std;
来避免在标准库类型和函数前加std::
。
- 包含
-
大数加法函数
BigNumAdd
:- 接收两个字符数组
str1
和str2
作为输入,它们存储了要相加的大数的字符串表示形式。 - 使用两个
stack<int>
类型的栈stack1
和stack2
来存储两个大数的每一位数字(转换为整数)。 - 使用
result
栈来存储最终相加的结果。 - 首先,跳过两个输入字符串前面的所有前导零。
- 将两个字符串的每一位数字转换为整数并压入对应的栈中。
- 使用一个布尔变量
flag
来记录是否需要进位。 - 当两个栈中任一栈不为空,或者存在进位时,执行相加操作:
- 从栈顶取出两个栈的数字(如果栈为空,则取0)。
- 将两个数字与进位相加,并根据结果判断是否需要新的进位。
- 将相加的结果(个位数)压入结果栈中。
- 返回结果栈。
- 接收两个字符数组
-
主函数
main
:- 首先读取一个整数
n
,表示有n
组测试用例。 - 对于每组测试用例,读取两个大数
str1
和str2
。 - 调用
BigNumAdd
函数进行相加,并将结果存储在result
栈中。 - 输出当前测试用例的编号和相加的结果:
- 输出第一个大数、加号、第二个大数和等号。
- 然后,从结果栈中弹出元素,直到栈为空,输出每一位数字。
- 首先读取一个整数
-
程序结束:
- 当所有测试用例处理完毕后,程序返回0,表示正常结束。
代码逻辑分析:
- 这段代码使用栈来模拟大数相加的过程,处理了前导零的问题,确保了输入字符串的有效性。
- 使用布尔变量
flag
来跟踪进位,确保了加法的正确性。
改进建议:
- 在
BigNumAdd
函数中添加对输入字符串的检查,确保它们不是nullptr
且不为空。 - 可以考虑使用
std::string
替代字符数组,以提高代码的安全性和易用性。 - 对于大数加法,还可以考虑实现其他大数运算,如减法、乘法和除法。
部分代码
// 专门用来解决开头的 0
i=0;
while(str1[i] == '0') i++;
for(; str1[i] != '\0'; i++)
{
stack1.push(str1[i]-'0');
}
i=0;
while(str2[i] == '0') i++;
for(; str2[i] != '\0'; i++)
{
stack2.push(str2[i]-'0');
}
// 用来记录是否需要进位
bool flag=false;
while(stack1.empty()==false || stack2.empty() == false || flag)
{
int x1 = 0;
if(stack1.empty()==false)
{
x1 = stack1.top();
stack1.pop();
}
int x2 = 0;
if(stack2.empty()==false)
{
x2 = stack2.top();
stack2.pop();
}
// 如果两个都为空,则就是 0+0+进位
int r = x1+x2+flag;
if(r >= 10)
{
r -= 10;
flag = true;
}
else
{
flag = false;
}
result.push(r);
AC代码
#include <iostream>
#include <stack>
#include <cstring>
using namespace std;
stack<int> BigNumAdd(char *str1,char *str2)
{
int i;
stack<int> stack1,stack2;
stack<int> result;
// 专门用来解决开头的 0
i=0;
while(str1[i] == '0') i++;
for(; str1[i] != '\0'; i++)
{
stack1.push(str1[i]-'0');
}
i=0;
while(str2[i] == '0') i++;
for(; str2[i] != '\0'; i++)
{
stack2.push(str2[i]-'0');
}
// 用来记录是否需要进位
bool flag=false;
while(stack1.empty()==false || stack2.empty() == false || flag)
{
int x1 = 0;
if(stack1.empty()==false)
{
x1 = stack1.top();
stack1.pop();
}
int x2 = 0;
if(stack2.empty()==false)
{
x2 = stack2.top();
stack2.pop();
}
// 如果两个都为空,则就是 0+0+进位
int r = x1+x2+flag;
if(r >= 10)
{
r -= 10;
flag = true;
}
else
{
flag = false;
}
result.push(r);
}
return result;
}
int main()
{
char str1[250],str2[250];
int n;
stack<int> result;
int i;
cin>>n;
for(i=1; i<=n; i++)
{
cin>>str1>>str2;
result = BigNumAdd(str1,str2);
cout<<"Case "<<i<<":"<<endl;
cout<<str1<<" + "<<str2<<" = ";
while(result.empty()==false)
{
int num=result.top();
result.pop();
cout<<num;
}
cout<<endl<<endl;
}
return 0;
}