• 带符号的整数做减法


    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;
    }
  • 相关阅读:
    201671030116宋菲菲 实验三作业互评与改进报告
    通读《构建之法》提出问题
    201671010460-朱艺璇-实验四附加实验
    201671010460朱艺璇 词频统计软件项目报告
    201671010460朱艺璇 实验三作业互评与改进报告
    阅读《现代软件工程—构建之法》提出的问题
    手把手带你了解消息中间件(3)——RocketMQ
    字符编码的历史由来
    linux常用命令
    linux各目录及重要目录的详细介绍
  • 原文地址:https://www.cnblogs.com/FCWORLD/p/2050226.html
Copyright © 2020-2023  润新知