高精度减法的OP写法

stone_juice石汁

2019-08-08 09:53:13

Personal

高精度减法基础

高精度减法的 \text{OP} 写法

#include<bits/stdc++.h>
#define mian main
#define QWQ puts("QWQ");
#define MAXN 10500 
using namespace std;
string a, b;

string _add(string a, string b)//高精度相加 (为底下a或b为负数相减做铺垫)这个都会吧。 
{
    string sum;
    int na[MAXN] = {0}, nb[MAXN] = {0}, ans[MAXN + 1] = {0}; 

    for(int i = a.size(); i > 0; i --)na[i] = a[a.size() - i] - '0';
    for(int i = b.size(); i > 0; i --)nb[i] = b[b.size() - i] - '0';

    int maxl = max(a.size(), b.size());
    for(int i = 1; i <= maxl; i ++)
    {
        ans[i + 1] = (ans[i] + na[i] + nb[i]) / 10;
        ans[i] = (ans[i] + na[i] + nb[i]) % 10; 
    }//相加 
    if(ans[maxl + 1] != 0)sum += "1";//特判 防止最大位进位 
    for(int i = maxl;i > 0; i --)sum += ans[i]+'0';
    return sum;
}

string _minus(string a, string b)
{
    int na[MAXN] = {0}, nb[MAXN] = {0}, ans[MAXN] = {0};
    string diff;

    if((a < b && a.size() <= b.size()) || b.size() > a.size())
        return "-" + _minus(b, a);

    for(int i = a.size(); i > 0; i --)na[i] = a[a.size() - i] - '0';
    for(int i = b.size(); i > 0; i --)nb[i] = b[b.size() - i] - '0';

    int maxl = max(a.size(), b.size());

    for(int i = 1; i <= maxl; i ++)
    {
        if(na[i] < nb[i])
        {
            na[i + 1] --;
            na[i] += 10;
        }
        ans[i] = na[i] - nb[i];
    }
    while(ans[maxl] == 0)maxl --;//防止减后降位,多输出若干0
    if(maxl < 1)return "0";
    for(int i = maxl; i > 0; i --)diff += ans[i] + '0';//数组转化为字符串。 
    return diff;
}

int main()
{
    string a,b;
    cin >> a >> b;
    if(a[0] == '-' && b[0] == '-')  //当两个数字为负数 
    {
        a.erase(0, 1);
        b.erase(0, 1);//擦掉a,b打头的负号再运算,下同
        cout << _minus(b,a);    //-a-(-b)=-a+b=b-a 
        return 0;
    }
    else if(a[0] == '-')  //只有a为负数 
    {
        a.erase(0, 1);
        cout << "-" << _add(a, b);  //-a-b=-(a+b)
        return 0;
    }
    else if(b[0] == '-')  //只有b为负数 
    {
        b.erase(0, 1);
        cout << _add(a, b);  //a-(-b)=a+b 
        return 0;
    } 
    else cout << _minus(a, b);
    return 0;
}