算法入门系列 C/C++语言的高精度减法(2/4)

目录

前言

1.高精度的认识

1.1高精度是什么?

1.2为什么需要高精度?

1.3怎么实现高精度?

2.高精度的逐步实现

2.1如何接受两个超大的数据?

2.2怎么把字符串给处理?逆序存入数组?

2.3数组加法函数的实现


前言

hello! 各位学习算法的宝子们大家好啊!很多编程语言都会提到精度问题,相信大家多多少少都了解过

我将陆续介绍 高精度的 加、减、乘、除         

将从三个方面带领大家学习

1.高精度是什么?

2.为什么需要高精度?

3.怎么实现高精度?

认识高精度   实现高精度

1.高精度的认识

1.1高精度是什么?

高精度算法High Accuracy Algorithm)是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方阶乘开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。

将会陆续介绍四种常见的高精度计算,

高精度加法、高精度减法、高精度乘低精度、高精度除低精度

1.2为什么需要高精度?

我们都知道C语言 long long 最大支持的数据范围是 :

-9223372036854775808~9223372036854775807

在处理一些较大数的运算,这些数甚至超过了unsigned long long的范围:
(0~2^64-1=18446744073709551615)

为了解决这个问题我们发明了高精度这一种算法

1.3怎么实现高精度?

如图我们知道了怎么把很长的数据存储下来

我们这里非常有必要再用一张图来解释为什么需要逆序处理?

2.高精度的逐步实现

2.1如何接受两个超大的数据?

首先long long 肯定不行,所以我们可以用字符串接收

int main()
{
    //定义两个字符串接受输入的数字
    char sa[N], sb[N];
    int a[N],b[N];
    scanf("%s",&sa);
    scanf("%s",&sb);

    return 0;
}

这里cmp方法是比较两个字符下的数字大小,.我们展示一下代码

//比较两个字符数字的大小
int cmp(char*a,char*b)
{
    if(strlen(a)>strlen(b))return 1;
    else if(strlen(a)<strlen(b))return -1;
    int len = strlen(a);
    for(int i = 0;i < len;i++)
    {
        if(a[i] > b[i])return 1;
        else if(a[i] < b[i])return -1;
    }
    return 0;
}

2.2怎么把字符串给处理?逆序存入数组?

int main()
{
    //定义两个字符串接受输入的数字
    char sa[N], sb[N];
    int a[N],b[N];
    scanf("%s",&sa);
    scanf("%s",&sb);

    //获取字符串长度 以便于倒序输入到数组
    la=strlen(sa);
    lb=strlen(sb);
    //翻转输入进去
    for(int i = 0,j = la-1;i < la;i++,j--)a[i] = sa[j] - '0';
    for(int i = 0,j = lb-1;i < lb;i++,j--)b[i] = sb[j] - '0';

    f(a,b);//把反转后的数组传入到我们计算加法的函数里
    return 0;
}

2.3数组加法函数的实现

//处理减法的函数
void f(int a[],int b[])
{
    //高位对齐
    int len = la > lb?la:lb;

    /*
        解释图
        1234 - 35 翻转如下
        4321
        53
        -1,0,2,1//每个数组元素如下
        9,9,1,1//借位补齐后
    */
    int v[len],t;
    //按位计算
    for(int i = 0;i < len;i++)
    {
        //相减
        t = a[i] - b[i];
        //判断是否需要借位
        if(t < 0)
        {
            a[i+1]--;
            v[i] = t + 10;
        }
        else v[i] = t;
    }
    t = len - 1;
    while(v[t]==0)t--;
    while(t >= 0)printf("%d",v[t--]);

}

好了以上就是我们高精度的减法的全部内容了

喜欢的小伙伴看到这里,麻烦三连+关注

你们的支持就是我创作最大的动力

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值