[HDOJ]1002.A + B Problem II

      A+B问题的变形,用同学的话说就是模拟大数加法问题,用数据结构接受两个无法用32位或者64位表示的大整型数,然后模拟整数相加的过程,最后把结果输出。
我在这里用两种方法,准确的说是用两种不同的数据结构解决这个大数相加问题,前者用STL,数据结构偏C++些,后者用char型数组接收两个大数,数据结构偏C
风格些,整体的流程是一样的,具体可参见下面的代码。
用char型数组接收大数:

#include  < iostream >
#include 
< cstring >
using   namespace  std;
int  main()
{
    
int  n,i  =   1 ;
    
char  a[ 1000 ],b[ 1000 ];    // 用来接收两个大数
    cin >> n;
    
while (i  <=  n)
    {
        
if (i  !=   1 )   // 控制格式
            cout << endl;
        cin
>> a >> b;
        
int  carry  =   0 ;   // 表示进位
         int  size,tsize,size1  =  strlen(a),size2  =  strlen(b);
        
if (size1  >  size2)
            size 
=  size1;
        
else
            size 
=  size2;
        tsize 
=  size;
       
int   * =   new   int [size];   // 新建数组存放最终结果
       size1  =  size1  -   1 ;
       size2 
=  size2  -   1 ;
       size 
=  size  - 1 ;
       
// 以下的while循环都是用来模拟加法
        while (size1  >=   0 && size2  >=   0 )
       {
            c[size] 
=  (a[size1]  -   ' 0 '   +  b[size2]  -   ' 0 '   +  carry) % 10 ;
            carry 
=  (a[size1]  -   ' 0 '    +  b[size2]  -   ' 0 '   +  carry) / 10 ;
            
-- size1;
            
-- size2;
            
-- size;
       }
       
while (size1  >=   0 )
       {
           c[size] 
=  (a[size1]  -   ' 0 '   +  carry) % 10 ;
           carry 
=  (a[size1]  -   ' 0 '   +  carry) / 10 ;
           
-- size1;
           
-- size;
       }
       
while (size2  >=   0 )
       {
           c[size] 
=  (b[size2]  -   ' 0 '   +  carry) % 10 ;
           carry 
=  (b[size2]  -   ' 0 '   +  carry) / 10 ;
           
-- size2;
           
-- size;
       }
       cout
<< " Case  " << i << " : " << endl;
       cout
<< a << "  +  " << b << "  =  " ;
       
if (carry)
           cout
<< carry;
       
for ( int  t  =   0 ;t < tsize; ++ t)
           cout
<< c[t];
       cout
<< endl;
       
++ i;
       delete []c;
    }
}

用string类型接收大数:

#include  < iostream >
#include 
< string >
#include 
< vector >
using   namespace  std;
int  main()
{
#ifdef ONLINE_JUDGE
#else
    freopen(
" in.txt " , " r " ,stdin);
#endif
    
int  i,n;
    
string  str1,str2;    // 用来接收两个大数
    vector < int >  ivec;    // 用来存放最终结果
    i  =   1 ;
    cin
>> n;
    
while (i  <=  n)
    {
        ivec.clear();
        str1.clear();
        str2.clear();
        cin
>> str1 >> str2;
        
int   size1  =  str1.size()  -   1 ,size2  =  str2.size()  -   1 ;
        
int  carry  =   0 ;   // carry表示进位
        
// 模拟加法过程
         while (size1  >=   0 && size2  >=   0 )
        {
            
int  temp;
            temp 
=  (str1.at(size1)  -   ' 0 '   +  str2.at(size2)  -   ' 0 '   +  carry) % 10 ;
            carry 
=  (str1.at(size1)  -   ' 0 '   +  str2.at(size2)  -   ' 0 '   +  carry) / 10 ;
            ivec.push_back(temp);
            
-- size1;
            
-- size2;
        }
        
while (size1  >=   0 )
        {
            
int  temp;
            temp 
=  (str1.at(size1)  -   ' 0 '   +  carry) % 10 ;
            carry 
=  (str1.at(size1)  -   ' 0 '   +  carry) / 10 ;
            ivec.push_back(temp);
            
-- size1;
        }
        
while (size2  >=   0 )
        {
            
int  temp;
            temp 
=  (str2.at(size2)  -   ' 0 '   +  carry) % 10 ;
            carry 
=  (str2.at(size2)  -   ' 0 '   +  carry) / 10 ;
            ivec.push_back(temp);
            
-- size2;
        }
        
if (carry)
            ivec.push_back(carry);
        
if (i  !=   1 )
            cout
<< endl;
        cout
<< " Case  " << i << " : " << endl;
        cout
<< str1 << "  +  " << str2 << "  =  " ;
        
for ( int  t  =  ivec.size()  -   1 ;t  >=   0 ; -- t)
            cout
<< ivec.at(t);
        cout
<< endl;
        
++ i;
    }
    
return   0 ;
}

在用STL解决问题时,还遇到了关于string::size_type的一些小的细节问题,以前真没注意过,可参见我博客的这篇文章,仅供以后注意。

转载于:https://www.cnblogs.com/krisdy/archive/2009/04/06/1430140.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值