高精度减法

减法比加法难在两个地方,一个是向上一位借位,这个代码实现比较容易,基本思路是把加法的向上进位改为减掉借位的1,就比较好实现了

第二个,是被减数比减数大,我的解决方案是把减得过程写成函数,在执行函数前进行一下判断,假设是a-b,当a<b就先输出-号,然后算b-a

代码实现如下

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<cstring>
    #include<string>
    using namespace std;
    char a1[1000],b1[1000];
    int a[1000],b[1000],c[1000],x,i,lena,lenb;
    void jian(int a[],int b[])
    {
        int m=max(lena,lenb);
        for(i=0;i<m;i++)
        {
            c[i]=a[i]-b[i]-x;//不能直接赋值,要加上前面的退位
            if(c[i]<0)
            {
                x=1;
                c[i]+=10;
            }
        }
        m++;
    }
    int main()
    {
        scanf("%s",a1);scanf("%s",b1);//scanf就爆0!
        
        if(a1[0]==48&&b1[0]==48)
        {
            cout<<"0"<<endl;
            return 0;
        }
        lena=strlen(a1),lenb=strlen(b1);
        for(i=0;i<lena;i++)
        {
            a[lena-i-1]=int(a1[i]-48);
        }
        for(i=0;i<lenb;i++)
        {
            b[lenb-i-1]=int(b1[i]-48);//倒序输入便于进位
        }
        i=0;
        if(strcmp(a1,b1)<=0)
        {
            printf("-");
            jian(b[i],a[i]);
        }
        else
        jian(a[i],b[i]);   
        m--; //删除前导0
        for(int i=m;i>=0;i--)
            cout<<c[i];
        cout<<endl;
        return 0;
}

 

posted @ 2019-03-03 12:26  Emiya_Shirou  阅读(193)  评论(0编辑  收藏  举报