大整数减法

#include <iostream>
#include <cstring>
using namespace std;
const int MAXLEN = 200;
//大整数减法
int Substract(int MaxLen, int *a1, int *a2)
{
    int nHighestPos = 0;
    for(int i = 0; i < MaxLen; ++i)
    {
        a1[i] -= a2[i];
        if(a1[i] < 0)//判断是否需要借位
        {
            a1[i] += 10;
            a1[i + 1]--;
        }
        if(a1[i] > 0)
        nHighestPos = i;
    }
    return nHighestPos;
}
//求最大值
int Max(int x, int y)
{
    return ((x > y) ? x : y);
}
int main()
{

    //标志应该谁是被减数,从而确定顺序
    int n;//要输入的组数
    cin >> n;
    while(n--)
    {
        char *s1 = new char[MAXLEN + 10]();//每次循环开始动态分配,结束动态释放内存,可以防止加减交替运算时造成的内存错误
        char *s2 = new char[MAXLEN + 10]();
        int *a1 = new int[MAXLEN + 10]();
        int *a2 = new int[MAXLEN + 10]();
        int Flag = 0;
        cin >> s1;
        cin >> s2;
        int nLen1 = strlen(s1);
        for(int i = nLen1 - 1, j = 0; 0 <= i; --i)
        {
            a1[j++] = s1[i] - '0';
        }
        int nLen2 = strlen(s2);
        for(int i = nLen2 - 1, j = 0; 0 <= i; --i)
        {
            a2[j++] = s2[i] - '0';
        }
        int MaxLen = Max(nLen1, nLen2);
        //
        if(nLen1 == nLen2)
        {
            for(int i = 0; i < nLen1; ++i)
            {
                if(s1[i] > s2[i])
                {
                    Flag = 1;
                    break;
                }else if(s2[i] > s1[i])
                {
                    Flag = 2;
                    break;
                }

            }
        }
        //
        if(Flag == 1 || nLen1 > nLen2)
        {
            int Pos = Substract(MaxLen, a1, a2);
            for(int i = Pos; 0 <= i; --i)
            cout << a1[i];
            cout << endl;
        }else if(Flag == 2 || nLen2 > nLen1)
        {
            int Pos = Substract(MaxLen, a2, a1);
            for(int i = Pos; 0 <= i; --i)
            {
                if(i == Pos)
                cout << -a2[i];
                else
                cout << a2[i];
            }
            cout << endl;
        }else
        cout << 0 << endl;
        delete [] s1;
        delete [] s2;
        delete [] a1;
        delete [] a2;

    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值