大位数加法,基础版本
啥都不说了,写的好拖沓。还是基础版本,只可以进行2个正数运算,负数计算应该并不困难,细节而已了。
用到了2个栈,但是感觉进位的栈并不是必要的。
BUG1:
在2个数字长度不一致是会出现计算错误,先等等,吃饭之后再说。(目测,已经修正了)
stack.h 可以在置顶贴的 《通用栈》中找到。
程序代码:#include <stdio.h>
#include <string.h>
#include "d:\mylib\stack.h"
#include "d:\mylib\getstring.h"
void
Add( char Op_1[ static 1 ], char Op_2[ static 1 ], char *Res );//函数并不检查参数的有效性,以及Res是否有足够的空间容纳结果
//如果你的编译器不支持C99或不完全支持导致函数原型通不过编译,改成 void Add( char *Op_1, char *Op_2, char *Res );
int
main( void )
{
char *op1;
char *op2;
char res[ 100 ];
op1 = getstring( stdin );//getstring()改成你能够使用的录入字符串的函数,例如fgets(),但是需要相应的修改 op1将不再是指针,而应该是数组。
op2 = getstring( stdin );
Add( op1, op2, res );
printf( "%s\n", res );
free( op1 );
free( op2 );
return 0;
}
void
Add( char Op_1[ static 1 ], char Op_2[ static 1 ], char *Res )
{//如果你的编译器不支持C99或不完全支持导致函数通不过编译,改成 void Add( char *Op_1, char *Op_2, char *Res );
register char *op_1;
register char *op_2;
char carr, ch_1, ch_2;
char ch_3;
Stack_T Carry,Result;
Carry = CreateStack( sizeof( char ) );
Result = CreateStack( sizeof( char ) );
op_1 = Op_1 + strlen( Op_1 );
op_2 = Op_2 + strlen( Op_2 );
ch_3 = '\0';
PoshStack( Result, &ch_3 );
while( 1 )
{
ch_1 = '0';
ch_2 = '0';
carr = '0';
if( ( op_1 == Op_1 && op_2 == Op_2 ) && IsEmptyStack( Carry ) )
break;
if( op_1 > Op_1 )
ch_1 = *--op_1;
if( op_2 > Op_2 )
ch_2 = *--op_2;
if( !IsEmptyStack( Carry ) )
{
carr = *( char * )TopStack( Carry );
PopStack( Carry );
}
ch_3 = ( ch_1 - '0' ) + ( ch_2 - '0' ) + ( carr - '0' );
if( ch_3 >= 10 )
{
carr = '1';
PoshStack( Carry, &carr );
}
ch_3 = ( ch_3 % 10 ) + '0';
PoshStack( Result, &ch_3 );
}
while( !IsEmptyStack( Result ) )
{
*Res++ = *( char * )TopStack( Result );
PopStack( Result );
}
DestroyStack( Result );
DestroyStack( Carry );
}
[此贴子已经被作者于2017-5-28 21:00编辑过]




