首页 > 其他分享 >高精度运算

高精度运算

时间:2024-02-05 11:11:39浏览次数:21  
标签:10 reverse 运算 高精度 back ans string size

逆序

void reverse(string &s)
{
    for (int i = 0; i < s.size() / 2; i++)
    {
        char t = s[i];
        s[i] = s[s.size() - 1 - i];
        s[s.size() - 1 - i] = t;
    }
}

高精度加法

高精 + 高精

string ans;

void add(string a, string b)
{
    ans.clear();
    reverse(a), reverse(b);

    char t = 0;
    for (int i = 0; i < a.size() || i < b.size(); i++)
    {
        if (i < a.size())
            t += a[i] - '0';
        if (i < b.size())
            t += b[i] - '0';
        
        ans.push_back(t % 10 + '0');
        t = t / 10;
    }
    if (t > 0)	// 处理进位
        ans.push_back(t + '0');
    reverse(ans);
}

高精度减法

高精 - 高精

string ans;

bool cmp(string a, string b)
{
    if (a.size() != b.size())
        return a.size() > b.size();
    else
        return a >= b;
}

void subtract(string a, string b)
{
    ans.clear();
    bool flag = false;

    if (!cmp(a, b))	// a - b 可能为负数
    {
        flag = true;
        swap(a, b);
    }
    reverse(a), reverse(b);
    
    char t = 0;
    for (int i = 0; i < a.size(); i++)
    {
        t = a[i] - '0' - t;
        if (i < b.size())
            t -= b[i] - '0';
        ans.push_back((t + 10) % 10 + '0');
        if (t < 0)
            t = 1;
        else
            t = 0;
    }

    while (ans.size() > 1 && ans.back() == '0')	// 处理前导0
        ans.pop_back();
    if (flag)	// a - b 为负数,添加负号
        ans.push_back('-');
    reverse(ans);
}

高精度乘法

高精度 * 高精度

string ans;

void multiply(string a, string b)
{
    ans.clear();
    reverse(a), reverse(b);
    ans.resize(a.size() + b.size(), '0');	// 乘法结果的位数最多为两个乘数的位数之和

    for (int i = 0; i < a.size(); i++)
    {
        int t = 0, j;
        for (j = 0; j < b.size(); j++)	// a的每一位与b分别相乘
        {
            t += (a[i] - '0') * (b[j] - '0') + ans[j + i] - '0';	// 乘法存在错位
            ans[j + i] = t % 10 + '0';
            t /= 10;
        }
        if (t > 0)	// 处理进位
            ans[j + i] = t + '0';
    }

    while (ans.size() > 1 && ans.back() == '0')	// 处理前导0
        ans.pop_back();
    reverse(ans);
}

高精度除法

高精 / 低精

string ans, rem;	// rem 为余数

void divid(string a, int b)
{
    ans.clear();

    int t = 0;
    for (int i = 0; i < a.size(); i++)
    {
        t = 10 * t + a[i] - '0';
        ans.push_back(t / b + '0');
        t %= b;
    }

    if (t == 0)	// 余数为0
        rem.push_back('0');
    while (t)	// 余数放入rem中
    {
        rem.push_back(t % 10 + '0');
        t /= 10;
    }

    reverse(ans);
    while (ans.size() > 1 && ans.back() == '0')	// 处理前导0
        ans.pop_back();

    reverse(ans), reverse(rem);
}

标签:10,reverse,运算,高精度,back,ans,string,size
From: https://www.cnblogs.com/hoyd/p/18007599

相关文章

  • 第三章——计算机进行小数运算时出错的原因
    在使用小数运算时计算机也会出错,这是因为有些十进制的小数无法转换为二进制数———例如二进制数0.0000对应的十进制数是0,二进制数0.0001对应的十进制数为0.625,由此得之二进制数是连续的而十进制数不是连续的,那十进制数0~0.625之间的数就无法用二进制数表示,进而出现错误。那实际......
  • Java 运算符详解与字符串处理技巧
    Java运算符算术运算符算术运算符用于执行常见的数学运算。运算符名称描述示例+加法将两个值相加x+y-减法从一个值中减去另一个值x-y*乘法将两个值相乘x*y/除法将一个值除以另一个值x/y%取模返回除法余数x%y++自增将变量......
  • 计算机进行小数运算时出错的原因
    看完第三章之后我知道了运算出错的原因是有一些十进制数的小数无法转换成二进制数还有就是小数是使用浮点数表示,浮点数是指符号尾数基数和指数这四个部分组成浮点数的表示右很多种其中最为普遍的是IEEE标准符号部分是指使用一个数据位来表示数值的符号;位数部分使用的是正则表达......
  • 第四章:集合运算
    第四章:集合运算4.1表的加减法4.1.1什么是集合运算集合在数学领域表示“各种各样的事物的总和”,在数据库领域表示记录的集合。具体来说,表、视图和查询的执行结果都是记录的集合,其中的元素为表或者查询结果中的每一行。在标准SQL中,分别对检索结果使用UNION,INTERSECT,EXCEPT......
  • CSAPP 第二章 信息的表示与处理(2) 整数运算
    加减法运算所有的加法运算在内存中的运算都遵循二进制的计算法则,只不过因为相同二进制表示在不同整数类型下表示的数不同,运算法则也有所不同。无符号加法计算规则可以将无符号数的加法视作是一种模运算,在二进制表示中丢弃掉溢出的位的操作就......
  • 13 - 运算符
    运算符汇总参考资料:菜鸟教程:python3运算符Python文档:运算优先级算术运算符以下假设变量a=10,变量b=21:运算符描述实例+加-两个对象相加a+b输出结果31-减-得到负数或是一个数减去另一个数a-b输出结果-11*乘-两个数相乘或是返回一个被重复......
  • Python 矩阵运算
    #coding=utf8fromrequests.sessionsimportsessionimportpubimportnumpyasnpimportdatetimeimportosfromapscheduler.schedulers.blockingimportBlockingSchedulerdefget_default_conn():  conn=(host="127.0.0.1",  port="3306&......
  • 位运算找是否有相同元素
    vector<string>words={"abcw","asd","awgf","dggg"}for(inti=0;i<n;++i){for(charch:words[i]){mask[i]|=1<<(ch-'a');}}给定string“abcf”初始:mask:00000000(一)对于......
  • 我对二进制的运算和用途的认识与思考
    在初步了解计算机的“大脑核心“CPU之后,对于计算机是如何处理数据、指令、函数的流程有了大致的逻辑认知。在阅读过有关二进制的知识后,对于计算机构成和运行有了更深的了解,主要分为对于二进制的运算和用途的思考。首先,作为计算机核心的CPU同其他计算机组件一样,都属于IC集成电路的......
  • (坚持每天写算法)算法学习与复习part1基础算法1-13——位运算
    最近确实有在写算法,在写dp,之前学的时候不全,被计数,树型等dp折磨了一下。位运算是将重点放在数字的位上,通常作为辅助行动,比如状态dp,有的时候是为了节省时空复杂度而使用的。这是今天的题目: 位运算应用的情况除了上面讲的,还有单纯的位问题,上面的题目就是一个例......