• 高精度


    高精度:

    在c++,各种数据类型存储的数据范围都是有限的:

    int:-2^31~2^31-1,大概2*1e9。

    unsigned int 0~2^32-1,大概4*1e9。

    long long :-2^63~2^63-1,大概9*1e18。

    unsigned long long:0~2^64-1,大概1e19。

    如果我们要表示的数非常大(例如1e10^5),这时就需要我们模拟加减乘除运算。

    高精度加法:

    一个大整数加上一个大整数。

    我们用两个vector存储两个整数,模拟加法即可。

    这里a,b存的是两个大整数,我们先存储低位再存储高位,res存储相加的结果。

    从低位往高位逐位相加即可。

    代码如下:

    1. vector<int>add(vector<int>a, vector<int>b) {
    2. vector<int>res;
    3. int tmp = 0;
    4. for (int i = 0; i < a.size() || i < b.size(); i++) {
    5. if (i < a.size())tmp += a[i];
    6. if (i < b.size())tmp += b[i];
    7. res.push_back(tmp % 10);
    8. tmp /= 10;
    9. }
    10. if (tmp > 0)res.push_back(tmp);
    11. return res;
    12. }

    高精度减法:

    两个大整数相减。同样是将两个数存入vector中,然后模拟减法即可。

    先判断大小,再让大数减去小数。

    先存储低位再存储高位,从前往后逐位相减,不够向前借位即可。最后记得删除前导0.

    代码如下:

    1. //判断大小
    2. bool cmp(vector<int>a, vector<int>b) {
    3. if (a.size() != b.size())return a.size() > b.size();
    4. for (int i = a.size() - 1; i >= 0; i--)
    5. if (a[i] != b[i])return a[i] > b[i];
    6. return true;
    7. }
    8. //大减小
    9. vector<int>sub(vector<int>a, vector<int>b) {
    10. vector<int>res;
    11. int tmp = 0;
    12. for (int i = 0; i < a.size(); i++) {//a大于b
    13. tmp = 0;
    14. tmp += a[i];
    15. if (i < b.size())tmp -= b[i];
    16. while (tmp < 0) { tmp += 10; a[i + 1]--; }
    17. res.push_back(tmp);
    18. }
    19. int i = res.size() - 1;
    20. while (res.size() > 1 && res[i] == 0) { res.erase(res.begin() + i); i--; }
    21. return res;
    22. }

    高精度乘法:

    一个小整数乘以一个大整数。大整数存入vector(从低位到高位),小整数存在int中即可。

    将小整数看做是一个一位的整数,和大整数的每一位相乘,模拟乘法即可。注意,每次相乘得到的数和上一轮相乘剩下的数相加是不会爆int的,每次剩下都会除10。

    同样记得去除前导0,因为这个小整数可能是0。

    代码如下:

    1. vector<int>mul(vector<int>a, int b) {
    2. vector<int>res;
    3. int tmp = 0;
    4. for (int i = 0; i < a.size() || tmp != 0; i++) {
    5. if (i < a.size())tmp += a[i] * b;
    6. res.push_back(tmp % 10);
    7. tmp /= 10;
    8. }
    9. while (res.size() > 1 && res.back() == 0)res.pop_back();
    10. return res;
    11. }


    高精度除法:

    一个大整数除以一个小整数。

    大整数存入vector(低位到高位),小整数存入int。

    注意除法是从高位往低位做,将小整数看做是一个一位数,逐位向后除。我们用一个中间变量tmp存储除剩的数,往后移动不断累加tmp即可(不够除向答案插入0即可),除完后的tmp也是余数。

    代码如下:

    1. //a除以b,余数为s
    2. vector<int>div(vector<int>a, int b, int& s) {
    3. vector<int>res;
    4. for (int i = a.size() - 1; i >= 0; i--) {
    5. s = s * 10 + a[i];
    6. res.push_back(s / b);
    7. s %= b;
    8. }
    9. reverse(res.begin(), res.end());
    10. while (res.back() == 0 && res.size() > 1)res.pop_back();
    11. return res;
    12. }


     

  • 相关阅读:
    C++ ,VCPKG那些事
    centos下安装docker
    web前端-javascript-基本语法(注释,常用语法,代码格式)
    21天学习挑战赛-静态链表以及一个带头结点的 线性链表类型 的定义
    王杰C++day5
    链表OJ(2)
    JAVA基础(三十六)——常用类之String类
    UDP网络套接字编程
    慢SQL治理经验总结
    TypeScript生成ES6的JS
  • 原文地址:https://blog.csdn.net/weixin_56265979/article/details/128019541