gwl999

博客园 首页 新随笔 联系 订阅 管理
  34 随笔 :: 0 文章 :: 0 评论 :: 2103 阅读

5.6


继续打卡模板题;

高精度加法

  • 主要思想:

  • 我们人都是从个位依次往高位算,同理,这里从个位开始,然后通过一个借记点进行进位;

  • #include "bits/stdc++.h"
    using namespace std;
    string a, b;
    vector<int> sum(vector<int>& a, vector<int>& b) {
        vector<int> res;
        if (a.size() < b.size())
            return sum(b, a);
        int t = 0;  //借记进位;
        for (int i = 0; i < a.size(); i++) {
            t = a[i] + t;//每次必先加a位置的数
            if (i < b.size())
                t += b[i];//如果b存在的话,加上b位置的数;
            res.push_back(t % 10);//每次只存一个位置;
            t /= 10;
        }
        if (t)
            res.push_back(1);//如果最高位上还有进位需要再将加上1;
        return res;
    }
    int main() {
        cin >> a >> b;
        vector<int> c, d;
        vector<int> res;
        for (int i = a.size() - 1; i >= 0; i--) {
            c.push_back(a[i] - '0');
        }
        for (int i = b.size(); i >= 0; i--) {
            c.push_back(b[i] - '0');
        }
        res = sum(c, d);
        for (int i = res.size() - 1; i >= 0; i--) {
            cout << res[i];
        }
        return 0;
    }

高精度减法:

  • 主要思想:其实同理,也是从个位进行相减;

  • 通过借记点进行保存移位;

  • 相减储存的时候,采用先将(小数+10)%10。这样能够将相减出来的数两种情况变成一种;

  • #include "bits/stdc++.h"
    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) {
        vector<int> C;
        for (int i = 0, t = 0; i < A.size(); i++) {
            t = A[i] - t;
            //这里很容易错,一定要写成a[i]-t而不是t
            //-=a[i]这个是t-a[i];结果是不一样的
            if (i < B.size())
                t -= B[i];
            C.push_back((t + 10) % 10);
            //这里是将两次情况进行了合并,t>=0和t<0;的情况压入
            if (t < 0)
                //说明有借记;
                t = 1;
            else
                //说明无借记
                t = 0;
        }
    
        while (C.size() > 1 && C.back() == 0)
    
            C.pop_back();
        return C;
    }
    
    int main() {
        string a, b;
        vector<int> c, d;
        cin >> a >> b;
        for (int i = a.size() - 1; i >= 0; i--) {
            c.push_back(a[i] - '0');
        }
        for (int i = b.size() - 1; i >= 0; i--) {
            d.push_back(b[i] - '0');
        }
        vector<int> res;
        if (cmp(c, d))
            res = sub(c, d);
        else
            res = sub(d, c), cout << "-";
        for (int i = res.size() - 1; i >= 0; i--) {
            cout << res[i];
        }
        return 0;
    }

高精度乘法

  • 主要思想

  • 每次都将高精度的从个位开始的数进行乘以低精度数;

  • 存储数的时候,先取模10计算结果值,后面再除10,得到进位的值;

  • #include "bits/stdc++.h"
    using namespace std;
    vector<int> mul(vector<int>& a, int b) {
        vector<int> res;
        int t = 0;
        for (int i = 0; i < a.size() || t; i++) {
            //t是为什么,t是每次进位不为0的情况
            if (i < a.size())
            //只有在a有位置的时候,才能进行乘法运算
                t += a[i] * b;
            res.push_back(t % 10);
            t /= 10;
        }
        while (res.size() > 1 && res.back() == 0) {
            res.pop_back();
        }
        return res;
    }
    int main() {
        string a;
        int b;
        cin >> a >> b;
        vector<int> v, res;
        for (int i = a.size() - 1; i >= 0; i--) {
            v.push_back(a[i] - '0');
        }
        res = mul(v, b);
        for (int i = res.size() - 1; i >= 0; i--) {
            cout << res[i];
        }
    }

高精度除法

  • 主要思想

  • 还是需要用进位处理除下来的余数;

  • 这里需要三个参数,高精度数,除数,余数;

  • 而且除法是只能从高位进行开始除的,这样就需要进位先除以除数,然后再对除数取模,得到下一次的余数

  • #include "bits/stdc++.h"
    using namespace std;
    vector<int> div(vector<int> a, int b, int& r) {
        // a是原来的vector数组;b是除数;r是余数;
        vector<int> res;
        //这个结果是商;
        r = 0;
        for (int i = a.size() - 1; i >= 0; i--) {
            //因为是除法,只能是从高到低开始除,所以,i是从a.size开始;
            r = r * 10 + a[i];
            //每次用余数乘上10加上向量中的每一个个数;
            res.push_back(r / b);
            r %= b;
            //每次还要除模:这样记吧。因为除模肯定是能得到最后的最小的余数的。
        }
        reverse(res.begin(), res.end());
        while (res.size() > 1 && res.back() == 0) {
            res.pop_back();
        }
        return res;
    }
    int main() {
        string a;
        int b;
        cin >> a >> b;
        vector<int> v;
        for (int i = a.size() - 1; i >= 0; i--) {
            v.push_back(a[i] - '0');
        }
        int r;
        vector<int> res;
        res = div(v, b, r);
        for (int i = res.size() - 1; i >= 0; i--) {
            cout << res[i];
        }
        cout << endl << r;
        return 0;
    }

posted on   呓雫  阅读(44)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示