HDU1002 A + B Problem II(修正版)

本文修正了一段用于解决ACM竞赛中的大数加法问题的代码,并详细展示了修改后的实现过程。通过加入缺失的操作符解决了之前存在的bug,同时验证了在线评测系统的测试数据可能存在的不足。

最近又开始做ACM题目了,昨天无意中翻阅自己写的一些blog,07年写的一篇blog:http://www.cnblogs.com/phinecos/archive/2007/12/22/1011028.html,发现评论中有朋友报了一个bug,随手调试了下程序,发现错误原因在于少了“++”,不过那代码也是AC了的,这说明OJ的测试数据有问题。特此修正代码如下:

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

void  Add( string  a, string  b, char  sum[], int &  count) 
{
// 大数加法
     int  len1  =  a.length(); // 数a的长度
     int  len2  =  b.length(); // 数b的长度
     int  i  =  len1 - 1 ,j  =  len2 - 1 ,temp  =   0 ,carryIn  =   0 ; // 初始进位为
    count  =   0
    
// 从最后一位开始做加法
     while (i >= 0 && j >= 0
    { 
        temp 
=  a[i] - ' 0 ' + b[j] - ' 0 ' + carryIn; // 计算当前位
        sum[count ++ =  temp % 10 + ' 0 '
        carryIn 
=  temp / 10 ; // 计算进位
         -- i; 
        
-- j; 
    } 
    
// 第一个数还有剩余
     if (i >= 0
    { 
        
// 利用进位继续做
         while (i >= 0
        { 
            temp 
=  a[i] - ' 0 ' + carryIn; 
            sum[count
++ =  temp % 10 + ' 0 '
            carryIn 
=  temp / 10
            
-- i; 
        } 
    } 
    
// 第二个数还有剩余
     if (j >= 0
    { 
        
while (j >= 0
        { 
            temp 
=  b[j] - ' 0 ' + carryIn; 
            sum[count
++ =  temp % 10 + ' 0 '
            carryIn 
=  temp / 10
            
-- j; 
        } 
    } 
    
// 最高位特殊考虑下
     if (carryIn > 0
    { 
        sum[count
++ =   ' 1 '
    } 


void  reversePrint( char  arr[], int  len) 
{
// 逆向输出
     for ( int  i = len - 1 ;i >= 0 ; -- i) 
    {
        cout
<< arr[i]; 
    }
    cout
<< endl; 


int  main() 

    
string  a,b; 
    
char  sum[ 2000 ]; //
    memset(sum, ' 0 ' , 2000 ); 
    
int  nCount  =   0
    
int  caseNum,curCase = 0
    cin
>> caseNum; 
    
do  
    { 
        curCase
++
        cin
>> a >> b; 
        Add(a,b,sum,nCount); 
        cout
<< " Case  " << curCase << " : " << endl; 
        cout
<< a << "  +  " << b << "  =  "
        reversePrint(sum,nCount); 
        
if (curCase < caseNum) 
        {
            cout
<< endl; 
        }
    }
while (curCase < caseNum); 
    
return   0


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值