什么是高精度?
高精度算法(High Accuracy Algorithm)是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数。(摘自百度百科)
为什么要用高精度算法?
在C/C++中,我们经常会碰到限定数据范围的情况。
C++标准规定:
int占一个机器字长。在32位系统中int占32位,也就是4个字节,所以int的范围是[-2^31,2^31-1],
为10^9数量级;
long long的范围是[-2^63,2^63-1],为10^18数量级。那么如果我们需要计算10^100该怎么办?
高精度加法
c1 = a1 + b1,c2 = a2 + b2.但是我们还有一个进位的问题。
这里我们以 68 + 25 = 93 为例。
a1?= 8,b1 = 5,c1 = 13;a2 = 6,b2 = 2,c2 = 8。此时我们利用一个累加的办法:
c[ i ] += a[ i ] + b[ i ];即可在每一次进行加法的时候将低位的进位加上来。
crr[i] += arr[i] + brr[i]; // 累加是因为后一步才计算的进位
crr[i + 1] = crr[i] / 10;
crr[i] = crr[i] % 10;
或许已经有小伙伴发现,我们的字符串下标是0~n,为什么我的是n~0?
因为0~n不符合我们平时计算的习惯,所以我们将第一个数和最后一个数调换,第二数和倒数第二个数调换,以此类推。
到此,我们还有最后一个问题,就是处理多余的0。我们一开始给数组全部赋值为0,假设我们设置数组长度为3,那么我们68 + 25 计算出来的结果就是093,所以我们需要删除前面的0。
if (crr[len_c] == 0 && len_c > 0) // 删除前面的0
{
len_c--;
}
那么为什么lc要大于0呢,假设我们仅仅计算0+0,最后的结果就是0,这里不能删除!
源代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
char str1[505], str2[505];
int arr[505], brr[505], crr[505];
int main()
{
int len_a, len_b, len_c;
scanf("%s", str1);
scanf("%s", str2);
len_a = strlen(str1);
len_b = strlen(str2);
for (int i = 0; i < len_a; i++)
{
arr[len_a - i] = str1[i] - '0'; // 将字符转化成数字(ASCII值计算),并且将字符逆序计算
}
for (int i = 0; i < len_b; i++)
{
brr[len_b - i] = str2[i] - '0';
}
len_c = max(len_a, len_b) + 1;
for (int i = 1; i < len_c; i++)
{
crr[i] += arr[i] + brr[i]; // 累加是因为后一步才计算的进位
crr[i + 1] = crr[i] / 10;
crr[i] = crr[i] % 10;
}
if (crr[len_c] == 0 && len_c > 0) // 删除前面的0
{
len_c--;
}
for (int i = len_c; i > 0; i--)
{
printf("%d",crr[i]);
}
return 0;
}
高精度减法:https://blog.csdn.net/Main_Int2022/article/details/126982472
后续会继续推出高精度乘除法,大家关注一下呗!
|