高精度减法模板

高精度减法模板

/ 0评 / 1509次 / 1

与高精度加法同理,只是需要处理一下长短问题而已

/*
 * @Author: Gehrychiang
 * @Date: 2020-02-01 10:32:54
 * @Website: www.yilantingfeng.site
 * @E-mail: gehrychiang@aliyun.com
 */
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000001;
char a[MAXN];
char b[MAXN];
char c[MAXN];

bool cmp(char a[], char b[])//自定义比较函数
{
    if (strlen(a) != strlen(b))
    {
        return strlen(a) > strlen(b);
    }
    else
    {
        if (strcmp(a, b) >= 0)
            return true;
        else
            return false;
    }
}

int main()
{
    cin >> a >> b;
    int flag = 0;
    if (cmp(a, b))
    {
        flag = 1; //正
    }
    else
    {
        swap(a, b);
        flag = -1;
    }
    int p = 0;
    int len_a = strlen(a);
    int len_b = strlen(b);
    int tmp = 0; //当前位
    int nex = 0; //下位借
    c[p] = '0';
    while (a[0] != '0' || b[0] != '0' || nex != 0) //a或b的最高位不为0即继续
    {
        c[p] = '0';
        tmp -= nex;
        nex = 0;
        tmp += a[max(len_a - 1 - p, 0)] - '0' - b[max(len_b - 1 - p, 0)] + '0';
        a[max(len_a - 1 - p, 0)] = '0';
        b[max(len_b - 1 - p, 0)] = '0';

        if (tmp < 0)
        {
            tmp += 10;
            nex += 1;
        }

        c[p] += tmp;
        tmp = 0;
        ++p;
    }
    int len_c = strlen(c);
    int lala = 0;//用来记录是否输出了第一个非0的数
    if(flag==-1)
    {
        cout<<"-";
    }
    for (int i = len_c - 1; i >= 0; i--)
    {
        if (c[i] != '0')
        {
            cout << c[i];
            lala = 1;
        }
        if (c[i] == '0' && lala)
        {
            cout << c[i];
        }
    }
    if(lala==0)
    {
        cout<<"0"<<endl;
    }
    return 0;
}

发表回复

您的电子邮箱地址不会被公开。

你好 No.63636