Signed integer subtraction

15103806_9VJc.gif 15103806_oVFF.gif View Code

    
#include < iostream >
using namespace std;

char a[ 1001 ] ;
char x_a[ 1001 ] , y_b[ 1001 ] ;
char xx[ 1001 ] , yy[ 1001 ];
char x1[ 1001 ] , y1[ 1001 ];
int Lx , Ly ;
int sum[ 1001 ] ;
int num ;
int sign = 0 ;
int mark_x , mark_y ;
int x[ 1001 ],y[ 1001 ];

void Init_A() // 将字符转化为数字
{
int i;
for ( i = 0 ; i < Lx ; i ++ ) x[i] = x_a[i] - ' 0 ' ;
for ( i = 0 ; i < Ly ; i ++ ) y[i] = y_b[i] - ' 0 ' ;

}

void Init_S()
{
int i;
for ( i = 0 ; i < Lx ; i ++ ) x1[Lx - i - 1 ] = x_a[i] ;
for ( i = 0 ; i < Ly ; i ++ ) y1[Ly - i - 1 ] = y_b[i];

strcpy(x_a , x1);
strcpy(y_b , y1);

Init_A();
}

void Change() // 交换x,y,如果x<y;
{

strcpy( a , y_b) ;
strcpy( y_b , x_a ) ;
strcpy( x_a , a ) ;

int temp = Lx ;
Lx
= Ly ;
Ly
= temp;
}

void Cmp( ) // 保证x>=y
{
int i;
if (Lx < Ly) { sign = 1 ; Change();}

if (Lx == Ly)
{
for ( i = 0 ; i < Lx ; i ++ )
if (x_a[i] < y_b[i]) break ;

if ( i != Lx )
{
sign
= 1 ;
Change();
}
}
}

void Add() // 高精度加法
{
num
= 0 ;
int i , j , flag = 0 ;

for ( i = Lx ,j = Ly ; i >= Lx - Ly , j >= 0 ; i -- , j -- )
{
sum[num
++ ] = ( x[i] + y[j] + flag) % 10 ;
flag
= ( x[i] + y[j] + flag) / 10 ;
}
for (i = Lx - Ly - 1 ; i >= 0 ; i -- )
{
sum[num
++ ] = ( x[i] + flag ) % 10 ;
flag
= ( x[i] + flag ) / 10 ;
}
while (flag)
{
sum[num
++ ] = flag % 10 ;
flag
/= 10 ;
}
}

void Sub() // 高精度减法
{
num
= 0 ;
int i ;
for (i = 0 ;i < Lx; i ++ )
{
sum[i]
+= x[i] - y[i];
if (sum[i] < 0 )
{
sum[i
+ 1 ] -- ;
sum[i]
+= 10 ;
}
}

while ( Lx > 1 && sum[Lx - 1 ] == 0 ) Lx -- ;
num
= Lx;

}

void PrintAdd()
{
int i;
for (i = num - 1 ;i > 0 ;i -- )
printf(
" %d " ,sum[i]);

}

void PrintSub()
{
int i;
for (i = num - 1 ;i >= 0 ; i -- )
printf(
" %d " ,sum[i]);

}
int main()
{
while (scanf( " %s%s " ,xx, yy) != EOF)
{
int L1 = strlen(xx);
int L2 = strlen(yy);

num
= 0 ; sign = 0 ;

memset( sum ,
0 , sizeof (sum));
memset( x ,
0 , sizeof (x));
memset( y ,
0 , sizeof (y));
memset( x_a ,
0 , sizeof (x_a));
memset( y_b ,
0 , sizeof (y_b));
memset( x1 ,
0 , sizeof (x1));
memset( y1 ,
0 , sizeof (y1));

mark_x
= mark_y = 0 ;

Lx
= L1;
Ly
= L2;

int i;

if ( xx[ 0 ] == ' - ' || xx[ 0 ] == ' + ' )
{
if (xx[ 0 ] == ' - ' ) mark_x = 1 ;

for ( i = 1 ; i < Lx ; i ++ ) x_a[i - 1 ] = xx[i];
Lx
= Lx - 1 ;
}

if (xx[ 0 ] != ' - ' && xx[ 0 ] != ' + ' )
{
for (i = 0 ;i < Lx;i ++ ) x_a[i] = xx[i];
}


if (yy[ 0 ] == ' - ' || yy[ 0 ] == ' + ' )
{
if (yy[ 0 ] == ' - ' ) mark_y = 1 ;

for (i = 1 ; i < Ly ; i ++ ) y_b[i - 1 ] = yy[i];
Ly
= Ly - 1 ;
}
if (yy[ 0 ] != ' - ' && yy[ 0 ] != ' + ' ) for (i = 0 ;i < Ly;i ++ ) y_b[i] = yy[i];


if (mark_x == 0 )
{
if ( mark_y == 0 )
{
Cmp();
Init_S();
Sub();
if (sign == 1 ) printf( " - " );
PrintSub();
}
if (mark_y == 1 )
{
Cmp();
Init_A();
Add();
PrintAdd();
}
}

if (mark_x == 1 )
{
if ( mark_y == 0 )
{
Cmp();
Init_A ();
Add();
printf(
" - " );
PrintAdd();
}
if (mark_y == 1 )
{
Cmp();
Init_S();
Sub();
if (sign == 0 ) printf( " - " );
PrintSub();
}
}

printf(
" \n " );
}
return 0 ;
}

Reproduced in: https: //my.oschina.net/garyun/blog/602915

Guess you like

Origin blog.csdn.net/weixin_34302561/article/details/91773982