大整数相减
来源:互联网 发布:游族网络公告 编辑:程序博客网 时间:2024/04/30 14:56
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<assert.h>char* bigIntMinus( const char* numstr1, const char* numstr2 ){ assert( numstr1 != NULL && numstr2 != NULL ); int len1 = strlen( numstr1 ); int len2 = strlen( numstr2 ); int resultLen = ( len1 > len2 ) ? ( len1 + 2 ) : ( len2 + 2 ); char* minusResult = new char[ resultLen ]; bool bFirstIsBigger = true; // 首先处理结果符号 if ( len1 > len2 ) { *minusResult = '+'; } else if ( len1 < len2 ) { *minusResult = '-'; bFirstIsBigger = false; } else { int cmpResult = strcmp( numstr1, numstr2 ); if ( cmpResult > 0 ) { *minusResult = '+'; } else { *minusResult = '-'; bFirstIsBigger = false; } } int tmpBigger[ resultLen ]; int tmpSmaller[ resultLen ]; int tmpResult[ resultLen ]; memset( tmpBigger, 0, resultLen * sizeof( int ) ); memset( tmpSmaller, 0, resultLen * sizeof( int ) ); memset( tmpResult, 0, resultLen * sizeof( int ) ); int i, j, k; if ( bFirstIsBigger ) { for ( i = 0; i < len1; i++ ) { tmpBigger[ i ] = *( numstr1 + len1 - i - 1 ) - '0'; } for ( j = 0; j < len2; j++ ) { tmpSmaller[ j ] = *(numstr2 + len2 - j - 1 ) - '0'; } } else { for ( i = 0; i < len2; i++ ) { tmpBigger[ i ] = *( numstr2 + len2 - i - 1 ) - '0'; } for ( j = 0; j < len1; j++ ) { tmpSmaller[ j ] = *( numstr1 + len1 -j -1 ) - '0'; } } // 求差 int currMINUS = 0; for ( k = 0; k < resultLen; k++ ) { currMINUS = tmpBigger[ k ] - tmpSmaller[ k ]; if ( currMINUS >= 0 ) { tmpResult[ k+1 ] = currMINUS; } else // 当前相减为负 { tmpBigger[ k+1 ] -= 1; // 高位借位 tmpResult[ k+1 ] = 10 + currMINUS; } } k = resultLen -1; while( !tmpResult[ k ] ) { k--; } for ( i = 0; i <= k; i++ ) { *( minusResult + i + 1 ) = tmpResult[ k-i ] + '0'; } *( minusResult + i ) = '\0'; return minusResult;}int main(){ const char* str1 = "198345793"; const char* str2 = "4943094930439340493039472"; char* result = bigIntMinus( str1, str2 ); printf( "%s - %s = %s\n", str1, str2, result ); // delete delete[] result; return 0;}
// main output
kennie@cbib:~/cplusplus$ g++ -o bigIntMinus.out bigIntMinus.cppkennie@cbib:~/cplusplus$ ./bigIntMinus.out198345793 - 4943094930439340493039472 = -4943094930439340294693679