A+B again

 

 

题目描述

谷学长有一个非常简单的问题给你,给你两个整数A和B,你的任务是计算A+B。

输入

输入的第一行包含一个整数T(T<=20)表示测试实例的个数,然后2*T行,分别表示A和B两个正整数。注意整数非常大,那意味着你不能用32位整数来处理。你可以确定的是整数的长度不超过1000。

输出

对于每一个样例,你应该输出两行,第一行是"Case #:",#表示第几个样例,第二行是一个等式"A+B=Sum",Sum表示A+B的结果。注意等式中有空格。

样例输入

2

2

112233445566778899 998877665544332211

样例输出

Case 1: 1 + 2 = 3

Case 2: 112233445566778899 + 998877665544332211 = 1111111111111111110

提示

 

大数加法问题,在大数运算里面相对还算简单,不过对初学者博主来说,思路清晰,不过写代码能力明显就有点跟不上了。

下面我们来分析下吧:

     前面的Case什么的只要把相应已知数据输出即可,下面我们重点来分析下加法的结果

    

       首先我们看他的输入,是连续输入,即这个大数字各个位之间是没有空格的,这就意味着用整型的数组难以实现数据的输入问题。因此我们考虑用字符型数组解决输入问题。

       这里方便起见;我们输入字符数组a为“98”,b为“9”  来分析下思路。

       原理就是模拟小学加法,要做加法,首先每位数字应对齐,才可对应相加。因此,我们考虑定义字符数组 char c[1001]来转移并对齐a,b中的元素;

                              cin>>a;  "98"

代码如下:


 

#include<iostream>
#include<cstring>
using namespace std;

char a[1001],b[1001];

void Add()//字符加法 
{
    
    char c[1001];
    memset(c,'0',1001);
    for(int i=0;i<strlen(a);i++)//对齐 
    {
        c[i]=a[strlen(a)-1-i];
    }
    
    
    memset(a,'0',1001);
    for(int i=0;i<strlen(b);i++)
    {
        a[i]=b[strlen(b)-1-i];
    }
    
    for(int i=0;i<1000;i++)
    {
        a[i]+=c[i]-'0';
        if(a[i]>'9')
        {
            a[i]-=10;
            a[i+1]++; 
        }
    }
    
}


int main()
{
    int T,n=0;
    cin>>T;
    while(T--)
  {
      n++;
    memset(a,'0',1001);
    memset(b,'0',1001);
    
    cin>>a>>b;
    
    cout<<"Case "<<n<<":"<<endl; 
    cout<<a<<" + "<<b<<" = ";
    
    
    Add();
    
    int k;
    for(k=1000;k>=0;k--)//排前导0 
    {
        if(a[k]!='0')
        {break;}
    }
    for(int i=k;i>=0;i--)
    {
        cout<<a[i];
    }
    cout<<endl;
   }
    return 0;
 } 

 

 

 

 

posted @ 2016-06-05 22:19  dearvee  阅读(2381)  评论(0编辑  收藏  举报