首页 > 其他分享 >高精度

高精度

时间:2023-01-20 19:12:02浏览次数:41  
标签:10 return 高精度 int back vector size

当计算位数超过最大存储范围时,无法正常存储而使用数组来存储数据

读取

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.putsh_back(b[i] - '0');

加法

不考虑AB为负数情况

vector<int> add(vector<int>& A, vector<int>& B)//取地址速度更快,避免复制占用时间
{
    if (A.size() > B.size()) return add(B, A); //始终保证A的长度大于等于B的长度

    vector<int> C; //存储答案
    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;
}

减法

这个模板前提是AB都为正数,当然也可以扩展为可以计算负数的情况,只需要对输入输出特殊处理

计算前需要先判断AB大小,如果 A-B<0 计算 b-aans=-(b-a)

bool cmp(vector<int>& A, vector<int>B)
{
    if (A.size() != B.size()) return A.size() > B.size();

    for (int i = 0; i < A.size(); i++)
        if (A[i] != B[i]) return A[i] > B[i];

    return true;//相等返回true
}
vector<int> sub(vector<int>& A, vector<int>& B)
{
    vector<int> C;
    int t = 0;
    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); //如果t<0,t=t+10,如果t>=0,t=t
        //判断是否需要借位
        if (t < 0) t = 1;
        else t = 0;
    }

    //处理前导零
    while (C.size() > 1 && C.back() == 0) C.pop_back();
    return C;
}

乘法

使用前提,一个很长的整数乘一个较小的整数

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;
}

除法

使用前提,一个很长的整数除一个较小的整数

vector<int> div(vector<int>& A, int b, int& r) //A除b,余数r
{
    vector<int> C;
    r = 0;
    for (int i = A.size() - 1; i >= 0; i--)
    {
        r = r * 10 + A[i];
        C.push_back(r / b);
        r %= b;
    }

    //存储时习惯低位在前,所以翻转C
    reverse(C.begin(), C.end());
    //处理前导零
    while (C.size() > 1 && C.back() == 0) C.pop_back();
    return C;
}

标签:10,return,高精度,int,back,vector,size
From: https://www.cnblogs.com/mpmp/p/17063025.html

相关文章

  • 高精度四则运算
    算法学习的第三天算法学习之高精度四则运算高精度算法(HighAccuracyAlgorithm)是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然......
  • [简单DP+高精度]围墙重建
    题目描述为了给同学们营造一个良好的学习环境和方便学校的管理,市政府准备对小W就读的学校进行重新规划,占地面积将再次扩大。学校通过领导会议决定,重建学校的围墙。由......
  • 模拟与高精度算法
    模拟模拟就是用计算机来模拟题目中要求的操作。模拟题目通常具有码量大、操作多、思路繁复的特点。由于它码量大,经常会出现难以查错的情况,如果在考试中写错是相当浪费时......
  • SOLIDWORKS 2023工程图和出详图新功能 创建更智能化 更高精度的工程详图
    工程图是传达您设计意图的重要文档,您设计的产品越复杂,越需要详细注释说明。SOLIDWORKS2023增强的工程图和出详图功能将帮助您创建更智能化、更高精度的工程详图,并且扩展新......
  • 大数的高精度算法
    高精度加法:#include<bits/stdc++.h>usingnamespacestd;stringadd(string&a,string&b){stringc;intt=0;if(a.length()<b.length())returnadd......
  • 高精度sleep
    voidmSleep(intmDelay)//毫秒数{mDelay*=1000;//转换成微秒LARGE_INTEGERt1,t2,freq;QueryPerformanceFrequency(&freq);QueryPerformanc......
  • 高精度+前缀和+差分
    高精度+前缀和+差分高精度高精度加法大整数存储:将数字存到数组里,第一个位置存个位,第二个位置存十位......从\(A_0+B_0\)开始算起,算个位,满十进一易错点:将数字存在......
  • 牛客训练(BIT+高精度)
    又是这类用BIT辅助计数的题。。这个显然满足要求的区间比不满足的要多太多,所以变成求不满足的。。。然后要先求总方案数,为这个不是很想在化了,反正O(n)求也可以的。。然后求......
  • 高精度运算
    高精度运算众所周知,c++有一种变量叫int_64……谁还用高精度呢好吧NOI与CSP貌似不支持int_64的样子完结撒花高精度运算,是指参与运算的数(加数,减数,因子……)范围大大超......
  • 高精度模板-结构体
    includeincludeincludeincludeusingnamespacestd;structBigNum{intlen,s[9999];BigNum(){memset(s,0,sizeof(s));len=1;}BigNumoperator=(co......