- 分享
高精度算法——综合贴
- 2022-9-7 20:55:29 @
高精度算法
1.什么是高精度
高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,我们可以将这个数字拆开,拆成一位一位的,或者是几位几位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。
对于这类问题,不要指望long double这些东西了,基本数据类型不可能存的下。我们可以把这两个数当成字符串输入到数组中,然后模拟手动的竖式运算(不会的话,回去上小学)得出结果。
说白了,高精度计算就是解决long long也解决不了的问题。
2.高精度的作用
正如上面所说的,高精度的作用就是对于一些异常之大的数字进行加减乘除乘方阶乘开方等运算。比如给你一道a+b的题目,读入a和b,让你输出它们的和,但a和b的范围都是小于等于10的6666次方,这个时候你就只能用高精度了。
3.高精度读入处理数据
当一个数据很大的时候,我们用一个整数类型是存不下的,所以我们可以先用一个字符串输入,这样就可以输入很长的数,然后再利用字符串函数和操作运算,将每一位数取出,存入一个数组里,我们用数组里的每一位表示这个数的每一个数位。
例如:998244353用数组储存下来,a{3,5,3,4,4,2,8,9,9},一般是倒着存(从低位到高位,因为整数没有除个位以下的数位,但你的最高位还可以进位,那么你就又要开一个位置来存这个新的最高位)。
高精度读入Code:
char s[6666];
int a[6666];
int main(){
scanf("%s",s+1);//用字符串读入
len=strlen(s+1);//这个数的长度为len
for(int i=1;i<=len;i++){
a[i]=s[len-i+1]-'0';//倒叙储存,每一位存一个数
}
return 0;
}
高精度输出Code:
int a[6666]
void write(int a[]){
for(int i=lena;i>0;i--){
printf("%d",a[i]);//一位一位输出这个数
}
}
详细请看:
squae!又又又水了一贴