#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
// 思路如下
// 将两个字符串分别由低位到高位放置到int数组中
// 然后每位对齐相加,大于10,本位取余,高位进1
char* bigIntAdd( const char* numstr1, const char* numstr2 )
{
assert( numstr1 != NULL && numstr2 != NULL );
int len1 = strlen( numstr1 );
int len2 = strlen( numstr2 );
int resultLen = ( len1 > len2 ) ? ( len1 + 1 ) : ( len2 + 1 );//考虑进位,所以要多出一位
int tmp1[resultLen]; // 放置第一个字符串由低位到高位的数字
int tmp2[resultLen]; // 放置第二个字符串由低位到高位的数字
int tmpResult[resultLen];
memset( tmp1, 0, resultLen * sizeof(int) );
memset( tmp2, 0, resultLen * sizeof(int) );
memset( tmpResult, 0, resultLen * sizeof(int) );
// 返回值结果
char* addResult = new char[ resultLen + 1 ];// 末尾填'\0'
memset(addResult, 0, resultLen*sizeof(char) );
int i,j,k;
// 取出由低位到高位的数字
for ( i = 0; i < len1; i++ )
{
tmp1[i] = *( numstr1 + len1 - i - 1 ) - '0';
}
for ( i = len1; i < resultLen; i++ )
{
tmp1[i] = 0;
}
// 取出由低位到高位的数字
for ( j = 0; j < len2; j++ )
{
tmp2[j] = *( numstr2 + len2 - j - 1) - '0';
}
for ( j = len2; j < resultLen; j++ )
{
tmp2[j] = 0;
}
// 求和
int currSUM = 0;
for ( k = 0; k < resultLen; k++ )
{
currSUM = tmp1[k] + tmp2[k];
if ( currSUM > 9 )
{
tmpResult[k] += currSUM - 10;
tmpResult[k+1] += 1;
}
else
{
tmpResult[k] += currSUM;
}
}
// 从后往前找到第一个不为零的数
k = resultLen-1;
while(!tmpResult[k])
{
k--;
}
// 返回值,字符串赋值
for (int i = 0; i <= k; i++)
{
*(addResult + i) = tmpResult[k-i] + '0';
}
*(addResult+i) = '\0';
return addResult;
}
int main()
{
const char* str1 = "123456789";
const char* str2 = "987654321";
char* result = 0;
result = bigIntAdd( str1, str2 );
printf( "%s + %s = %s\n", str1, str2, result );
// delete
delete[] result;
return 0;
}
// main output
kennie@cbib:~/cplusplus$ ./bigIntAdd.out
123456789 + 987654321 = 1111111110