我们,初学者,应该互相帮助。:)
这是我的五分钱。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int is_overflow( const char *s1, size_t n1, const char *s2, size_t n2 )
{
const int Base = 10;
int overflow = 0;
while ( n1 != 0 && n2 != 0 )
{
overflow = !( overflow + ( s1[--n1] - '0' ) + ( s2[--n2] - '0' ) < Base );
}
while ( overflow && n1 != 0 )
{
overflow = !( overflow + ( s1[--n1] - '0' ) < Base );
}
while ( overflow && n2 != 0 )
{
overflow = !( overflow + ( s2[--n2] - '0' ) < Base );
}
return overflow;
}
char * add_strings_as_numbers( char *s1, size_t n1,
const char *s2, size_t n2,
const char *s3, size_t n3 )
{
const int Base = 10;
int overflow = 0;
while ( n2 != 0 && n3 != 0 )
{
char c = overflow + ( s2[--n2] - '0' ) + ( s3[--n3] - '0' );
overflow = !( c < Base );
s1[--n1] = c % Base + '0';
}
while ( n2 != 0 )
{
char c = overflow + ( s2[--n2] - '0' );
overflow = !( c < Base );
s1[--n1] = c % Base + '0';
}
while ( n3 != 0 )
{
char c = overflow + ( s3[--n3] - '0' );
overflow = !( c < Base );
s1[--n1] = c % Base + '0';
}
if ( overflow ) s1[--n1] = overflow + '0';
return s1;
}
int main(void)
{
const char *s1 = "5880391469248794735212";
const char *s2 = "1234567890231";
// const char *s1 = "1";
// const char *s2 = "999";
const size_t N1 = strlen( s1 );
const size_t N2 = strlen( s2 );
size_t n = ( N1 < N2 ? N2 : N1 ) + is_overflow( s1, N1, s2, N2 ) + 1;
char *result = calloc( n, sizeof( char ) );
add_strings_as_numbers( result, n - 1, s1, N1, s2, N2 );
printf( "\"%s\" + \"%s\" = \"%s\"\n", s1, s2, result );
free( result );
return 0;
}
程序输出是
"5880391469248794735212" + "1234567890231" = "5880391470483362625443"
或者直接在函数add_strings_as_numbers中分配一个新字符串会更好,如下面的演示程序所示。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
static int is_overflow( const char *s1, size_t n1, const char *s2, size_t n2 )
{
const int Base = 10;
int overflow = 0;
while ( n1 != 0 && n2 != 0 )
{
overflow = !( overflow + ( s1[--n1] - '0' ) + ( s2[--n2] - '0' ) < Base );
}
while ( overflow && n1 != 0 )
{
overflow = !( overflow + ( s1[--n1] - '0' ) < Base );
}
while ( overflow && n2 != 0 )
{
overflow = !( overflow + ( s2[--n2] - '0' ) < Base );
}
return overflow;
}
char * add_strings_as_numbers( const char *s1, size_t n1,
const char *s2, size_t n2 )
{
const int Base = 10;
size_t n = ( n1 < n2 ? n2 : n1 ) + is_overflow( s1, n1, s2, n2 );
char *result = calloc( n + 1, sizeof( char ) );
if ( result != NULL )
{
int overflow = 0;
while ( n1 != 0 && n2 != 0 )
{
char c = overflow + ( s1[--n1] - '0' ) + ( s2[--n2] - '0' );
overflow = !( c < Base );
result[--n] = c % Base + '0';
}
while ( n1 != 0 )
{
char c = overflow + ( s1[--n1] - '0' );
overflow = !( c < Base );
result[--n] = c % Base + '0';
}
while ( n2 != 0 )
{
char c = overflow + ( s2[--n2] - '0' );
overflow = !( c < Base );
result[--n] = c % Base + '0';
}
if ( overflow ) result[--n] = overflow + '0';
}
return result;
}
int main(void)
{
const char *s1 = "5880391469248794735212";
const char *s2 = "1234567890231";
// const char *s1 = "1";
// const char *s2 = "999";
const size_t N1 = strlen( s1 );
const size_t N2 = strlen( s2 );
char *result = add_strings_as_numbers( s1, N1, s2, N2 );
printf( "\"%s\" + \"%s\" = \"%s\"\n", s1, s2, result );
free( result );
return 0;
}