目录
前言
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 肯定不行,所以我们可以用字符串接收,完成逆序存入数组
#include<stdio.h>
#include<string.h>
int la,lb;
//定义两个字符串接受输入的数字
char sa[100005];
int a[100005],b,v[100005];
//把两组数据,逆序放进 a b的数组
void inputA()
{
scanf("%s",&sa);
scanf("%d",&b);
//获取字符串长度
la=strlen(sa);
//只需要输入A进去
for(int i = 0;i < la;i++)a[i] = sa[i] - '0';
}
2.2把 a b数组传入到除法函数
int main()
{
inputA();
//特殊判断
if(sa == "0") //被除数等于0
{
printf("0");//直接输出0
return 0;
}
f(a,b);//传入到除法函数
}
2.3数组加法函数的实现
//除法函数
void f(int a[],int b)
{
int len = la;
int r = 0;//余数
for(int i = 0;i < la;i++)
{
a[i]+=r*10;
v[i]=a[i]/b;
r=a[i]%b;
}
//去头0处理
int t = 0;
while(v[t] == 0&&t < len)t++;
for (int i = t; i < len; i++)printf("%d",v[i]);
if(t == len)printf("0");//商为 0
printf("\n%d",r);//输出余数
}
好了以上就是我们高精度的除法的全部内容了
喜欢的小伙伴看到这里,麻烦三连+关注
你们的支持就是我创作最大的动力