• 高精度模板


    1、高精度加法模板

    #include <bits/stdc++.h>
    
    using namespace std;
    
    /**
     * 功能:高精度加法模板
     * @param A
     * @param B
     * @return
     */
    vector<int> add(vector<int> &A, vector<int> &B) {
        //声明结果数组C
        vector<int> C;
    
        //以长的为根基,进行计算
        if (A.size() < B.size()) return add(B, A);
        //进位
        int t = 0;
        //列竖式进行计算
        for (int i = 0; i < A.size(); i++) {
            t += A[i];//进位加法
            if (i < B.size()) t += B[i]; //存在这一位,就加
            C.push_back(t % 10);//保留余数
            t /= 10;//进位
        }
        //最后可能还有进位
        if (t) C.push_back(t);
        //返回
        return C;
    }
    
    int main() {
        //以字符串形式读入
        string a, b;
        cin >> a >> b;
        //1、准备动作,将字符串的每一位,反序放入到整数运算数组中
        vector<int> A, B, C;
        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');
    
        //2、调用模板进行计算
        C = add(A, B);
    
        //3、输出结果,需要倒序噢
        for (int i = C.size() - 1; i >= 0; i--)printf("%d", C[i]);
        return 0;
    }
    

    2、高精度减法模板

    #include <bits/stdc++.h>
    
    using namespace std;
    
    /**
     * 功能:高精度减法模板
     * @param A
     * @param B
     * @return
     */
    vector<int> sub(vector<int> &A, vector<int> &B) {
        int t = 0;
        vector<int> C;
        for (int i = 0; i < A.size(); i++) {
            t = A[i] - t;
            if (i < B.size()) t -= B[i];
            C.push_back((t + 10) % 10);
            if (t < 0)t = 1; else t = 0;
        }
        while (C.size() > 1 && C.back() == 0) C.pop_back();
        return C;
    }
    
    //对比函数
    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;
    }
    
    int main() {
        //以字符串形式读入
        string a, b;
        cin >> a >> b;
        vector<int> A, B, C;
        //1、准备动作,将字符串的每一位,反序放入到整数运算数组中
        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');
        //2、调用模板进行计算
        if (cmp(A, B)) C = sub(A, B);
        else {
            printf("-");
            C = sub(B, A);
        }
        //3、输出结果,需要倒序噢
        for (int i = C.size() - 1; i >= 0; i--)printf("%d", C[i]);
        return 0;
    }
    

    3、高精度乘以低精度模板

    #include <bits/stdc++.h>
    
    using namespace std;
    
    /**
     * 功能:高精度乘低精度模板
     * @param A
     * @param b
     * @return
     */
    vector<int> mul(vector<int> &A, int b) {
        vector<int> C;
        int t = 0;
        for (int i = 0; i < A.size() || t; i++) {
            if (i < A.size()) t += A[i] * b;
            C.push_back(t % 10);
            t /= 10;
        }
        while (C.size() > 1 && C.back() == 0) C.pop_back();
        return C;
    }
    
    int main() {
        string a;
        int b;
        vector<int> A, C;
        cin >> a >> b;
        //倒着放的噢~
        for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');
        C = mul(A, b);
        //倒着输出噢~
        for (int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]);
        return 0;
    }
    

    4、高精度乘以高精度模板

    #include <bits/stdc++.h>
    
    using namespace std;
    
    /**
     * 功能:高精度乘高精度模板
     * @param A
     * @param b
     * @return
     */
    vector<int> mul(vector<int> &A, vector<int> &B) {
        //初始化大小
        vector<int> C(A.size() + B.size());
        //先放里再说
        for (int i = 0; i < A.size(); i++)
            for (int j = 0; j < B.size(); j++)
                C[i + j] += A[i] * B[j];
    
        //处理余数
        for (int i = 0, t = 0; i < C.size(); i++) {
            t += C[i];
            if (i >= C.size()) C.push_back(t % 10);
            else C[i] = t % 10;
            t /= 10;
        }
        //去掉前导0
        while (C.size() > 1 && C.back() == 0) C.pop_back();
        return C;
    }
    
    int main() {
        string a, b;
        cin >> a >> b;
        //准备动作
        vector<int> 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 = mul(A, B);
        //倒序输出
        for (int i = C.size() - 1; i >= 0; i--) cout << C[i];
        return 0;
    }
    

    5、高精度除以低精度模板

    #include <bits/stdc++.h>
    
    using namespace std;
    typedef long long LL;
    /**
     * 注意:用例:9000000000 1000000000
     * 此时,因为涉及到乘法计算,使用int会爆掉,在洛谷提交会最后一个点无法通过,全部使用LL后可以正常通过测试点。
     */
    using namespace std;
    /**
     * 功能:高精度除法模板(高精除低精)
     * @param A
     * @param b
     * @param r
     * @return
     */
    vector<LL> div(vector<LL> &A, LL b, LL &r) {
        vector<LL> C;
        r = 0;
        for (int i = A.size() - 1; i >= 0; i--) {
            r = r * 10 + A[i];
            C.push_back(r / b);
            r %= b;
        }
        reverse(C.begin(), C.end());
        while (C.size() > 1 && C.back() == 0) C.pop_back();
        return C;
    }
    
    int main() {
        string a;
        LL b, r;
        cin >> a >> b;
        vector<LL> A, C;
        for (int i = a.size() - 1; i >= 0; i--)A.push_back(a[i] - '0');
        C = div(A, b, r);
        for (int i = C.size() - 1; i >= 0; i--)printf("%d", C[i]);
    //    printf("
    %d", r);
        return 0;
    }
    
    
  • 相关阅读:
    OPC客户端的进程安全初始化
    [精华] Oracle安装(linux)总结一下[转]
    Linux防火墙iptables的设置与启动[转]
    Linux Server 5.5安装SVN+Apache服务[转]
    Red hat Linux Enterprise 5.4 Edtion 学习笔记[二]
    RedHat Linux 5企业版开启VNCSERVER远程桌面功能[转]
    Linux服务配置:Vsftp的基本配置[转]
    Linux查看和剔除当前登录用户
    Ubuntu10.04的中文问题汇集与解决[转]
    Linux下扩展swap分区的方法
  • 原文地址:https://www.cnblogs.com/littlehb/p/14981155.html
Copyright © 2020-2023  润新知