最近又开始做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 ;
}
#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 ;
}