C++高精度减法

题目

给定两个正整数(不含前导 0),计算它们的差,计算结果可能为负数。

输入格式
共两行,每行包含一个整数。

输出格式
共一行,包含所求的差。

数据范围
1≤整数长度≤105
输入样例:
32
11
输出样例:
21

代码

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

vector<int>a,b;

bool check(vector<int>&a,vector<int>&b)//检查a是否大于b
{
    if(a.size()!=b.size())
    {
        return a.size()>b.size();
    }
    for(int i=a.size()-1;i>=0;i--)
    {
        if(a[i]!=b[i])
        {
            return a[i]>b[i];
        }
    }
    return true;
}

vector<int>sub(vector<int>a,vector<int>b)
{
    vector<int>c;
    int t=0,i=0,sub=0;
    for(i;i<a.size();i++)
    {
        if(i<b.size())
        {
            sub=a[i]-b[i]-t;
        }
        else
        {
            sub=a[i]-t;
        }
        if(sub<0)
        {
            t=1;
            sub+=10;
        }
        else
        {
            t=0;
        }
        c.push_back(sub%10);
    }
    while(c.back()==0&&c.size()>1)//去掉结果的前置0
    {
        c.pop_back();
    }
    return c;
}

int main()
{
    string A,B;
    cin>>A>>B;
    for(int i=A.size()-1;i>=0;i--)
    {
        a.push_back(A[i]-'0');
    }
    for(int i=B.size()-1;i>=0;i--)
    {
        b.push_back(B[i]-'0');
    }
    vector<int>c;
    if(check(a,b))
    {
        c=sub(a,b);
        for(int i=c.size()-1;i>=0;i--)
        {
            printf("%d",c[i]);
        }
    }
    else
    {
        c=sub(b,a);
        cout<<'-';
        for(int i=c.size()-1;i>=0;i--)
        {
            printf("%d",c[i]);
        }
    }
    return 0;
}
对于浮点数的高精度减法,可以将浮点数转化为字符串,然后按照高精度减法的思路进行计算,最后再将结果转化为浮点数。 以下是一个使用字符串实现高精度减法的例子: ```c++ #include <iostream> #include <string> #include <algorithm> // for reverse() using namespace std; string float_sub(string a, string b) { int lena = a.length(), lenb = b.length(); int dotPosa = a.find('.'), dotPosb = b.find('.'); int lenDeca = (dotPosa == -1 ? 0 : lena - dotPosa - 1); int lenDecb = (dotPosb == -1 ? 0 : lenb - dotPosb - 1); // 补足小数点后的0 if (lenDeca < lenDecb) { a.append(lenDecb - lenDeca, '0'); } else if (lenDecb < lenDeca) { b.append(lenDeca - lenDecb, '0'); } // 补足小数点前的0 if (dotPosa < dotPosb) { a.insert(0, dotPosb - dotPosa, '0'); } else if (dotPosb < dotPosa) { b.insert(0, dotPosa - dotPosb, '0'); } // 对齐后的长度 int len = max(lena, lenb); // 去掉小数点 a.erase(dotPosa, 1); b.erase(dotPosb, 1); // 翻转字符串方便计算 reverse(a.begin(), a.end()); reverse(b.begin(), b.end()); // 计算 string c(len, '0'); int carry = 0; for (int i = 0; i < len; i++) { int numa = (i < lena ? a[i] - '0' : 0); int numb = (i < lenb ? b[i] - '0' : 0); int numc = numa - numb - carry; if (numc < 0) { numc += 10; carry = 1; } else { carry = 0; } c[i] = numc + '0'; } // 去掉前导0 while (c.length() > 1 && c.back() == '0') { c.pop_back(); } // 加上小数点 int lenDec = max(lenDeca, lenDecb); if (lenDec > 0) { c.insert(len - lenDec, "."); } // 翻转回来 reverse(c.begin(), c.end()); return c; } int main() { string a = "123.456"; string b = "78.9"; string c = float_sub(a, b); cout << c << endl; return 0; } ``` 这个例子中,我们首先将小数点后的0补足,然后将小数点前的0也补足,接着去掉小数点,翻转字符串,进行高精度减法计算,再去掉前导0,加上小数点,最后翻转回来,得到最终结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值