hnust 1032: A + B Problem II

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 的结果。在两个相邻之间输出一个空行 测试用例。

解题过程

这道题要用到高精度加法,用字符串代替数字计算

下面是对代码的详细解析:

  1. 头文件和命名空间

    • 包含 <iostream><stack><cstring> 头文件,分别用于输入输出、栈操作和字符串操作。
    • 使用 using namespace std; 来避免在标准库类型和函数前加 std::
  2. 大数加法函数 BigNumAdd

    • 接收两个字符数组 str1str2 作为输入,它们存储了要相加的大数的字符串表示形式。
    • 使用两个 stack<int> 类型的栈 stack1stack2 来存储两个大数的每一位数字(转换为整数)。
    • 使用 result 栈来存储最终相加的结果。
    • 首先,跳过两个输入字符串前面的所有前导零。
    • 将两个字符串的每一位数字转换为整数并压入对应的栈中。
    • 使用一个布尔变量 flag 来记录是否需要进位。
    • 当两个栈中任一栈不为空,或者存在进位时,执行相加操作:
      • 从栈顶取出两个栈的数字(如果栈为空,则取0)。
      • 将两个数字与进位相加,并根据结果判断是否需要新的进位。
      • 将相加的结果(个位数)压入结果栈中。
    • 返回结果栈。
  3. 主函数 main

    • 首先读取一个整数 n,表示有 n 组测试用例。
    • 对于每组测试用例,读取两个大数 str1str2
    • 调用 BigNumAdd 函数进行相加,并将结果存储在 result 栈中。
    • 输出当前测试用例的编号和相加的结果:
      • 输出第一个大数、加号、第二个大数和等号。
      • 然后,从结果栈中弹出元素,直到栈为空,输出每一位数字。
  4. 程序结束

    • 当所有测试用例处理完毕后,程序返回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;
}
  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值