C++基础算法高精度篇

这篇具有很好参考价值的文章主要介绍了C++基础算法高精度篇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

📟作者主页:慢热的陕西人

🌴专栏链接:C++算法

📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言

主要讲解了高精度算法的四种常用的计算

C++基础算法高精度篇,C++算法,算法,c++,开发语言

Ⅲ. 高精度

以下数字均指位数

①A + B(精度均在10^6)

②A - B (精度均在10^6)

③A * b (len(A) <= 10^6, a <= 1000);

④A / b (len(A) <= 10^6, a <= 1000);

Ⅲ. Ⅰ . A + B:

思路:将两个大数先用字符串保存,然后再倒序存入到数组中(这是因为我们在运算的时候会产生进位)。然后再实现一个add函数实现加法,将运算的结果存储到一个数组中:

代码:

#include <iostream>
#include <vector>

using namespace std;

vector<int> add(vector<int>& A, vector<int>& B)
{
    vector<int> C;
    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];

        C.push_back(t % 10);
        t /= 10;
    }
    if (t) C.push_back(1);

    return C;
}


int main()
{
    string a, b;
    vector<int> A, B;
    cin >> a >> b; //将A和B存储在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');
    auto C = add(A, B);

    for (int i = C.size() - 1; i >= 0; --i) printf("%d", C[i]);



    return 0;
}

Ⅲ. Ⅱ . A - B:

思路:存储思路都是统一的,需要一个借位t.

每一位的计算:x = Ai - Bi - t,如果x大于零那么本位减法的结果就是x,如果x小于零那么需要在x结果的基础上加上10

总结果的计算:如果A >= B那么结果就是A - B,如果A < b那么结果就是-(B - A)

在计算之前我们要保证每次都是大数减小数,所以要先实现一个cmp函数来比较哪一个数字大。

代码:

#include <iostream>
#include <vector>

using namespace std;
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;
}

vector<int> sub(vector<int>& A, vector<int>& B)
{
    vector <int> C;
    for (int i = 0, t = 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;
}


int main()
{
    string a, b;
    vector<int> A, B;
    cin >> a >> b; //将A和B存储在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');
    if (cmp(A, B))
    {
        auto C = sub(A, B);
        for (int i = C.size() - 1; i >= 0; --i) printf("%d", C[i]);
    }
    else
    {
        auto C = sub(B, A);
        printf("-");
        for (int i = C.size() - 1; i >= 0; --i) printf("%d", C[i]);
    }
    return 0;
}

Ⅲ. Ⅲ. A * b:

思路:存储数据的思路不变,特别的点在于对进位和本位计算的处理。

例如:我们要计算123 * 12。

首先我们将3 * 12 + t 存到t里面,那么本位就是t % 10 = 6 , 而进位就是t / 10 = 3 ;

以此类推将2 * 12 + t 存到t里面,那么本位就是t % 10 = 7,而进位就是t / 10 = 2;

最后我们将1 * 12 + t 存到t里面,那么本位就是t % 10 = 4, 而进位就是t / 10 = 1

最后如果t不为零的话,那么最高位的值就是继续将t进行分解。

代码:

#include <iostream>
#include <vector>

using namespace std;

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

    return C;
}


int main()
{
    string a;
    int b;
    vector<int> A;
    cin >> a >> b; //将A和B存储在a和b的字符串中
    for (int i = a.size() - 1; i >= 0; --i) A.push_back(a[i] - '0');

    auto C = mul(A, b);

    for (int i = C.size() - 1; i >= 0; --i) printf("%d", C[i]);

    return 0;
}

Ⅲ. Ⅲ. A / b:

思路:A / B 的话我们是从高位开始计算的,而且计算机每次只能计算一位。

那么我们每次计算都将余数存储在r中,然后每次都将r * 10,最后再加上除数的本位,然后再次计算余数,直到除数计算完成。

代码:

#include <iostream>
#include <vector>

using namespace std;

//A 是除数, b是被除数,r是余数
vector<int> div(vector<int>& A,int b, int &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;
    }
    //反转为标准的存储格式
    reverse(C.begin(),C.end());
    //去掉前导零
    while (C.size() > 1 && C.back() == 0) C.pop_back();

    return C;
}


int main()
{
    string a;
    int b;
    int r = 0;
    vector<int> A;
    cin >> a >> b; //将A和B存储在a和b的字符串中
    for (int i = a.size() - 1; i >= 0; --i) A.push_back(a[i] - '0');

    auto C = div(A, b, r);

    for (int i = C.size() - 1; i >= 0; --i) printf("%d", C[i]);
    cout << endl << r;


    return 0;
}

到这本篇博客的内容就到此结束了。
如果觉得本篇博客内容对你有所帮助的话,可以点赞,收藏,顺便关注一下!
如果文章内容有错误,欢迎在评论区指正

C++基础算法高精度篇,C++算法,算法,c++,开发语言文章来源地址https://www.toymoban.com/news/detail-597774.html

到了这里,关于C++基础算法高精度篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法之高精度(含实例与详解)C语言

           高精度本质上是一种计算,由于int型和long long型的存储的数据大小有限。在有符号定义的情况下,int型为2的31次方减1;在无符号定义的情况下,lint型为2的32次方。因此过于巨大的数无法展示,这就用到了高精度来计算,其原理为将很大的数一位一位存在数组中,最后

    2024年02月06日
    浏览(25)
  • 【c++】算法:高精度(经典加减乘除){含解析(图解)}

    Hi~ o(* ̄▽ ̄*)ブ,今天来一起看看c++算法之高精度 之后会持续更新有关c++算法系列,欢迎观看!(#^.^#) 目录 前言 使用高精度的目的: 基本方法介绍:   一、A+B problem 基本思路解析: 具体步骤: 代码如下: 二、A-B problem 基本思路解析: ​编辑 具体步骤:  代码如下:  三

    2024年01月23日
    浏览(41)
  • C++高精度问题

    C++中int不能超过2^31-1,最长的long long也不能超过2^63-1,所以我们在题目中如果碰到了很长很长的数,并且需要进行大数运算时,就需要高精度存储。 由于int和long long的限制,我们要想存放很长的数就需要利用数组存储,C++中可以利用STL中的vector容器存储 读取:  由于数据很大,

    2024年01月24日
    浏览(37)
  • C++实现高精度减法

    一、问题描述:        高精度算法是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方

    2024年02月14日
    浏览(22)
  • 算法笔记——高精度算法(附源码)

    📖作者介绍:22级树莓人(计算机专业),热爱编程<目前在c++阶段, 因为最近参加新星计划算法赛道(白佬),所以加快了脚步,果然急迫感会增加动力 ——目标Windows,MySQL,Qt,数据结构与算法,Linux,多线程,会持续分享学习成果和小项目的 📖作者主页:热爱编程的

    2023年04月08日
    浏览(22)
  • 高精度算法详解

    首先要知道为什么需要高精度算法: 高精度算法是 处理大数字 的数学计算方法,当数字过大不能用 int 和 long long 存储时,我们就可以 使用string和vector类型 来存储他们的每一位,然后进行计算。 我们可以先把要输入的两个数字放到vector中存储,注意要 反着存(后边做加法

    2024年01月17日
    浏览(33)
  • 【算法】模拟,高精度

      P1601 A+B Problem(高精) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路就是模拟,值得注意的就是要用字符串类型输入。存进自己的int数组时要倒着存,因为如果是正着存的话,进位会有点trouble。 时间复杂度O(max(m,n))    P1303 A*B Problem - 洛谷 | 计算机科学教育新生态 (lu

    2024年02月09日
    浏览(28)
  • 高精度算法笔记·····························

    加法 减法 乘法 除法 高精度加法的步骤: 1.高精度数字利用字符串读入 2.把字符串 翻转 存入两个整型数组A、B 3.从低位到高位,逐位求和,进位,存余 4.把数组C从高位到低位依次输出         1.2为准备         3为加法具体实现(0按位取反为-1,即-1时结束等价于=0)  

    2024年01月21日
    浏览(33)
  • 高精度减法(C语言实现)

    众所周知,整数在C和C++中以 int , long , long long 三种不同大小的数据存储,数据大小最大可达 2^64 ,但是在实际使用中,我们仍不可避免的会遇到爆 long long 的超大数运算,这个时候,就需要我们使用高精度算法,来实现巨大数的运算。 高精度的本质是将数字以字符串的形

    2024年02月05日
    浏览(28)
  • 高精度除法【c++实现】超详细讲解

    高精度算法分为两种,高精除以低精和高精除以高精。不要看都是除法,就认为原理类似,其实是有很大差距的。让我们一起来学习吧! 有句话说在前面,如果除数等于0,就不要算了,不成立。( 如果你忘了这个知识,小学数学老师饶不了你 ) 高精度除低精度,原理是模

    2024年02月13日
    浏览(18)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包