(C++)HDU1002题——大数相加

题目描述

input

输入的第一行包含整数T(1 <= T <= 20),表示测试用例的数量。 然后是T行,每行包含两个正整数,A和B.请注意,整数非常大,这意味着您不应该使用32位整数来处理它们。 您可以假设每个整数的长度不超过1000

output

对于每个测试用例,您应输出两行。 第一行是“Case#:”,#表示测试用例的编号。 第二行是方程“A + B = Sum”,Sum表示A + B的结果。注意方程中有一些空格。 在两个测试用例之间输出一个空行。

思路分析

由题意可知,该题目要求对两个非常大的整数进行相加,所以不要尝试使用long long int,题目所给的整数已经不能用C++的数据类型来表示,所以考虑最一般的加法,一位一位的计算,重点在于:本位数字 =( a + b + 前一位进位 )% 10
还有要注意输出的格式,空行只出现在两个测试用例中间,最后一个测试实例后不用加空行

代码(可AC)

#include
#include
using namespace std;
char a[1010],b[1010],c[1010],d[1010];
int main()
{
     
    int n,s,y=0;
    cin>>n;
    while(n--)
    {
     
        y++;
        cin>>a>>b;
        int s1=strlen(a);
        int t1=0;
        int s2=strlen(b);
        //将数组a进行反转
        for(int i=s1-1;i>=0;--i)
        {
     
            c[t1]=a[i];
            ++t1;
        }

        //将数组b进行反转
        t1=0;
        for(int i=s2-1;i>=0;--i)
        {
     
            d[t1]=b[i];
            ++t1;
        }
        //找到两个数字的最大长度,并将位数补成同位
        if(s1>s2)
        {
     
            s=s1;
            for(int i=s2;i<s1;++i)
                d[i]='0';
        }
        else
        {
     
            s=s2;
            for(int i=s1;i<s2;++i)
                c[i]='0';
        }
        //按照加法法则,本位数字=(数字1+数字2+前一位进位)%10
        int t=0,x1,x2;
        for(int i=0;i<s;++i)
        {
     
            x1=c[i]-'0';
            x2=d[i]-'0';
            d[i]=(x1+x2+t)%10+'0';
            t=(x1+x2+t)/10;
        }
        //判断最高位是否有进位
        if(t==0)
        {
     
            cout<<"Case "<<y<<':'<<endl;
            cout<<a<<" + "<<b<<" = ";
            for(int i=s-1;i>=0;--i)
                cout<<d[i];
            if(n!=0)
                cout<<endl<<endl;
            else
                cout<<endl;
        }
        else
        {
     
            cout<<"Case "<<y<<':'<<endl;
            cout<<a<<" + "<<b<<" = ";
            char c='1';
            strcat(d,&c);
            for(int i=s;i>=0;--i)
                cout<<d[i];
            if(n!=0)
                cout<<endl<<endl;
            else
                cout<<endl;
        }
    }
    return 0;
}

如果有更好的方法,欢迎评论留言

你可能感兴趣的:(算法,oj题解)