高精度算法详解(加减乘除+高精度案例)

什么是高精度算法?

        高精度通常指的是在计算机中对超过基本数据类型表示范围的大整数或者小数进行精确计算的能力。在计算机中,通常使用固定长度的数据类型(比如int、long、float、double等)来表示数字,这些数据类型的表示范围是有限的,超出这个范围的数字就无法被准确表示和计算,这就需要使用高精度计算。

        精度计算经常用于需要对非常大或者非常精确的数字进行计算的场景,比如在密码学中的大素数运算、金融领域的精确计算、科学计算中的精确浮点数运算等。为了实现高精度计算,通常需要设计特定的数据结构和算法来表示和计算这些超出固定数据类型范围的数字.

        算法应用范围: 高精度计算广泛应用于算法设计中,包括动态规划、数论、组合数学、几何算法等领域。许多经典算法问题,如大整数乘法、大整数除法、高精度加减法等都需要高精度计算来解决。

在所有代码中,我都加上了详细的注释,如果有算法设计思路看不懂的同学,可以结合着代码一起学习,如果还有不会的地方,可以直接在评论区问我哦

最后,一定要看代码哦,代码才是最重要的

高精度加法

算法设计思路:

  • 从低位到高位,逐位将对应位的数字相加,并考虑前一位的进位。
  • 将相加的结果与进位相加,得到当前位的最终结果,并更新下一位的进位。
  • 将得到的最终结果记录下来,并继续进行上述步骤,直到所有位都被处理完毕。

 高精度加法的设计思路主要包括以下几个关键步骤:

1. 输入处理 - 将输入的两个高精度数以字符串的形式接收。

2.将字符串拆解为一个个数字存到int数组中

3. 逐位相加 - 从低位(字符串的末尾)开始,逐位将两个数的对应位数字相加,并加上前一位的进位。 - 计算当前位的和,并计算进位。

4. 处理进位 - 如果当前位的和大于等于 10 ,则需要向高位进位。

5. 结果处理 - 去除结果前面可能存在的多余的 0 。 

以下是高精度加法的算法实现:

/*
Author:XYu12301
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'

int main()
{
    string s1,s2; // 用于存储输入的两个字符串,例如 "123" 和 "1456"
    int a[505]={0},b[505]={0},c[505]={0}; // 三个整数数组,用于存储转换后的数字

    cin>>s1>>s2; // 输入两个字符串

    int la = s1.length(),lb = s2.length(); // 获取两个字符串的长度

    // 将字符串 s1 转换为逆序存储在数组 a 中
    for(int i=0;i<la;i++)      
    {
        a[la-i-1]=s1[i]-'0';   // 实现数字的逆序存储,如 "123" 存储为 321
    }

    // 将字符串 s2 转换为逆序存储在数组 b 中
    for(int i=0;i<lb;i++)
    {
        b[lb-i-1]=s2[i]-'0';   // 实现数字的逆序存储,如 "1456" 存储为 6541
    }

    int l =max(la,lb); // 确定结果数组的最大长度

    // 进行逐位相加,并处理进位
    for(int i=0;i<l;i++)
    {
        c[i] += a[i] + b[i]; // 当前位相加
        c[i+1] = c[i]/10; // 计算进位
        c[i] %= 10; // 保留当前位的值
    }

    // 去除结果前面的前导 0
    while(c[l]==0&&l>0)l--;   
    /*去除前置 0 可以简化数字的表示,减少不必要的位数。
    在高精度加法中,通常会涉及到对两个数字进行逐位相加的操作,如果其中一个数字有大量的前置 0,会导致计算过程变得复杂和冗长。*/

    // 输出结果
    for(int i=l;i>=0;i--)
    {
        cout<<c[i];     // 逆序输出相加的结果
    }

    return 0;
}

 下面是luogu一道经典的高精度加法的案例,看懂的小伙伴可以自己尝试一下哦

 P1601 A+B Problem࿰

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值