![15103806_9VJc.gif](http://static.oschina.net/uploads/img/201601/15103806_9VJc.gif)
![15103806_oVFF.gif](http://static.oschina.net/uploads/img/201601/15103806_oVFF.gif)
#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