zoukankan      html  css  js  c++  java
  • 高精度

    高精度

    高精度加法

    1、用途

    计算两个大非负整数相加

    2、原理

    模拟竖式运算

    3、复杂度

    (O(n))

    4、模板

    vector <int> add(vector <int> &A, vector <int> &B)
    {
        vector <int> temp; int t = 0;
        for (int i = 0; i < A.size() || i < B.size(); ++i)
        {
            if (i < A.size()) t += A[i];
            if (i < B.size()) t += B[i];
            temp.push_back(t % 10);
            t /= 10;
        }
        if (t) temp.push_back(t);
        return temp;
    }
    

    5、备注

    ①数字的存储方式和一般的书写方式不同,低位在前,高位在后。读入和输出时都要把目标对象反转。

    高精度减法

    1、用途

    计算两个大非负整数相减

    2、原理

    模拟竖式运算

    3、复杂度

    (O(n))

    4、模板

    bool cmp(string &a, string &b)
    {
        if (a.length() != b.length()) return a.length() < b.length();
        else
        {
            for (int i = 0; i < a.length(); ++i)
                if (a[i] != b[i]) return a[i] < b[i];
        }
        return 0;
    }
    vector <int> sub(vector <int> &A, vector <int> &B)
    {
        vector <int> temp; int t = 0;
        for (int i = 0; i < A.size(); ++i)
        {
            t = A[i] - t;
            if (i < B.size()) t -= B[i];
            temp.push_back((t + 10) % 10);
            if (t < 0) t = 1; else t = 0;
        }
        while (temp.size() > 1 && temp.back() == 0) temp.pop_back();
        //去前导0 注意要留至少一位数
        return temp;
    }
    

    5、备注

    ①数字的存储方式和一般的书写方式不同,低位在前,高位在后。读入和输出时都要把目标对象反转。

    ②在使用时要先对输入的(a, b)进行大小判断,若(a<b)要先输出负号。

    高精度乘法

    1、用途

    计算大非负整数乘小非负整数

    2、原理

    模拟竖式运算

    3、复杂度

    (O(n))

    4、模板

    vector <int> mul(vector <int> &A, int b)
    {
        vector <int> temp; int t = 0;
        for (int i = 0; i < A.size() || t; ++i)
        {
            if (i < A.size()) t += A[i] * b;
            temp.push_back(t % 10);
            t /= 10;
        }
        while (temp.size() > 1 && temp.back() == 0) temp.pop_back();
        return temp;
    }
    

    5、备注

    ①数字的存储方式和一般的书写方式不同,低位在前,高位在后。读入和输出时都要把目标对象反转。

    高精度除法

    1、用途

    计算大非负整数除小正整数

    2、原理

    模拟竖式运算

    3、复杂度

    (O(n))

    4、模板

    vector <int> div(vector <int> &A, int b, int &r)
    {
        vector <int> temp;
        for (int i = A.size() - 1; i >= 0; --i)
        {
            r = r * 10 + A[i];
            temp.push_back(r / b);
            r %= b;
        }
        reverse(temp.begin(), temp.end());
        while (temp.size() > 1 && temp.back() == 0) temp.pop_back();
        return temp;
    }
    

    5、备注

    ①数字的存储方式和一般的书写方式不同,低位在前,高位在后。读入和输出时都要把目标对象反转。

    ②高精度除法顺序和加减乘不同,是从高位往低位运算的。因此答案存储的时候是正序。为与之前的模板保持一致,需要把答案(reverse)再返回。

    ③写代码时循环中不需要特判前导0,最后翻转之后可以直接去除。

    ④观察到余数(r<b<maxint),所以可以直接用(int)存储。由于要返回答案和余数,所以把余数用引用传入函数。

    例题

    PTAL1-046 整除光棍

  • 相关阅读:
    python每日作业4/21
    socket实现并发之socketserver模块的使用
    python socket粘包问题的解决
    每日作业:4/20
    网络编程基础(socket)
    网络基础之网络协议
    异常处理
    python 作业4/15
    centos7简单安装配置mariadb
    Centos7下Firewalld防火墙配置命令
  • 原文地址:https://www.cnblogs.com/Lecxcy/p/13565563.html
Copyright © 2011-2022 走看看