杭电oj-1002-A+B Problem

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

 

 问题分析

 此题是有一定难度的,其难点在于,如何表示当有1000位数的数字,因为就算是long long 型也是无法表达这么大的数字的(long long 是能表示出最大的数字的数据类型,其范围为9223372036854775807 ~ -9223372036854775808),因此应考虑采用数组进行存储,把我们输入的数转换成字符串,再将其转换为整数,另外,在本题中要注意相加的几种情况,

第一种,A.length==B.length

第二种,A.length>B.length

第三种,A.length<B.length

 对于每种情况应该如何考虑,最后要注意题中所给的输入、输出格式。

 

 

Code:

#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
string a,b;
int sum[1005],q;//q为相加之后的位数 
void add2(string a,string b) {
        /*两个大数相加求和*/
    int m,n,t=0,i=0,int_a,int_b;
    //t为进位数 
    m=a.length()-1;
    n=b.length()-1;
    while(m>=0&&n>=0){
        int_a=a[m]-'0';//将输入的每一位数先转换成int型 
        int_b=b[n]-'0';
        sum[i]=(int_a+int_b+t)%10;//相加后第i位的数字
        t=(int_a+int_b+t)/10;//相加后向上一位进的位数
        i++; 
        m--; 
        n--; 
    }
    if(m>n){
        while(m>=0){
            int_a=a[m]-'0';
            sum[i]=(int_a+t)%10;
            t=(int_a+t)/10;
            m--;
            i++;
        }
        
    }
    if(m<n){
        while(n>=0){
            int_b=b[n]-'0';
            sum[i]=(int_b+t)%10;
            t=(int_b+t)/10;
            n--;
            i++;    
        }
            
    }
    q=i-1;
    if(t>=1)//最后一次相加存在进位时 
        {
            sum[i]=t;
            q=i;
        }
    

}
void output() {
    /*输出函数*/
    int i=q;
    cout<<a<<" + "<<b<<" = ";
    for(;i>=0;i--){
        
        cout<<sum[i];        
    }
    cout<<endl; 
    
}
int main() {
    int n;//测试用例数
    cin>>n;
    int i=0;
    for(; i<n; i++) {
        cin>>a>>b;
        add2(a,b);
        printf("Case %d:\n",i+1);//测试样例格式 
        output();
        if(i<n-1)
        cout<<endl;
    }
    return 0;
}

 

 

转载于:https://www.cnblogs.com/X-Do-Better/p/8596137.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值