带符号的整数做减法

Deadly 提交于 2019-11-28 02:08:28
ContractedBlock.gifExpandedBlockStart.gifView 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;
}

转载于:https://www.cnblogs.com/FCWORLD/archive/2011/05/18/2050226.html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!