C++高精度减法

C++高精度减法

两个数减法运算,会出现负数的情况,两个数的位数是10万级。
输出:
一行,减法运算结果。

题解:

该题由于数据的位数较大,所以将数据以字符形式读入,然后经过运算之后,再通过数值形式输出。

  1. 首先将两个数读入,读入两个字符串
  2. 将字符串转换成数值类型,放在容器里面,A.push_back(data);放数据的时候是从A[0]开始放
  3. 调用构造的减法函数
  4. 先判断两个数谁大,谁小,我们用大的数值减去小的数值,最后输出的时候,判断是否输出负号。
  5. 减法从最低为开始运算,如果该为减法之后出来的结果是负值,则需要借位
  6. 如果被减数没有了,则直接用减数位减去借位。
  7. 每一位通过C.push_back();放在C里,从0(地位)——到高位存,低位数存低位地址里。
  8. 输出的时候先判断正负,再输出C里面的值,从高位倒着输出。
#include <iostream>
#include <vector>
using namespace std;
bool cmp(vector<int> A, vector<int> 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)
{
    if(!cmp(A, B))
    {
        return sub(B, A);
    }
    vector<int> C;
    int b = 0;//借位
    int t = 0;//当前位结果
    for(int i = 0; i < A.size(); i++)
    {
        if(i < B.size()) t = A[i] - B[i] - b;
        else t = A[i] - b;
        if(t < 0)
        {
            b = 1;
            C.push_back(t + 10);
        }
        else
        {
            b = 0;
            C.push_back(t);
        }
    }
    while(C.size() > 1 && C.back() == 0) C.pop_back();
    return C;
    
}
int main()
{
    string a, b;
    vector<int> 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');
    auto C = sub(A, B);
    if(!cmp(A, B))
    {
        printf("-");
    }
    for(int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]);
    return 0;
}

巧妙的程序:

其中,两个数比较大小的程序比较巧妙,通过一个bool类型的返回值,判断是否是A>=B。

  • A >= B 返回:true
  • A < B 返回:false
    当 return A[i] > B[i] 时,如果满足条件,则返回true, 如果条件不满足,则返回false。
    比较两个数的大小,先通过两个数的位数比较,如果位数相同,再从高位向低位逐位比较,当出现不相等的位时就可以判断,哪个大了。

活动地址:毕业季·进击的技术er

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
对于浮点数的高精度减法,可以将浮点数转化为字符串,然后按照高精度减法的思路进行计算,最后再将结果转化为浮点数。 以下是一个使用字符串实现高精度减法的例子: ```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,加上小数点,最后翻转回来,得到最终结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小猛笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值