关与高精度算法的学习

这篇博文会记载我学习c语言高精度算法的过程,我会将我学习的内容输出的这篇博文之下。

高精度顾名思义就是将长到longlong都无法储存的数字存储到数组内进行四则运算。
原理其实和小学学的竖式可以说一模一样。每一位相加大于10进1。实现这个的代码如下

1
2
3
4
5
arr3[i]=arr[i]arr1[i]+arr2[i];
arr3[i+1]=arr3[i]/10;
arr3[i]=arr3[i]%10;


当然我们都知道字符型数组里的元素是无法进行四则运算的所以我们需要将字符串转换为整形数组主要操作如下(由于在循环时我们习惯将i从小到大进行++所以我们在将字符串存储在整形数组里时需要以下代码的操作就是将字符串反向存储到整形数组中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int i=0
//arr1和arr2为字符串数组
//arr3和arr4为整形数组
s1=strlen(arr1);
s2=strlen(arr2);
for(;i<s1;i++)
{
arr3[s1-i]=arr1[i]-'0';//将字符串的数字反向存储到整形数组中,使arr3[1]是个位上的数
}
i=0;
for(;i<s2;i++)
{
arr4[s2-i]=arr2[i]-'0';
}

那么我们利用以上两个程序就可以写出高精度加法了(代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[1000] = {"0"};
char arr2[1000] = {"0"};
int arr3[1000] = {0};
int arr4[1000] = {0};
scanf("%s%s", arr1, arr2);
int s1 = strlen(arr1);
int s2 = strlen(arr2);
//将字符串转换
int i = 0, j = 0;
for (;i < s1;i++)
{
arr3[s1-i]=arr1[i]-'0';
}
for (;j < s2;j++)
{
arr4[s2-j] = arr2[j]-'0';
}
int max = 0;
if (s1 >= s2)
max = s1;
else
max = s2;
int add[1000] = { 0 };
for (i = 1;i <= max;i++)
{
add[i] = add[i] + arr3[i] + arr4[i];
add[i + 1] = add[i] / 10;
add[i] = add[i] % 10;
}
i = max;
for (;i>0;i--)
printf("%d", add[i]);
}

以上代码就是高精度加法了

加法之后自然就是减法

相信各位都有攻读过小学学历吧,那么攻读过小学学位的各位应该知道,在小学是没有负数的,所有我们需要先比两个数组的大小后对数组进行交换

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int t = 0;
char arr1[10000] = { "0" };
char arr2[10000] = { "0" };
scanf("%s%s", &arr1, &arr2);
int s1 = strlen(arr1);
int s2 = strlen(arr2);
int i = 0;
if (arr1[0]<arr2[0] && s1 == s2 || s2>s1)
{
for (;i < s2;i++)
{
t = arr2[i];
arr2[i] = arr1[i];
arr1[i] = t;
}
}

而后与加法相同先将字符串转换为整形数组。代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int i=0
//arr1和arr2为字符串数组
//arr3和arr4为整形数组
s1=strlen(arr1);
s2=strlen(arr2);
for(;i<s1;i++)
{
arr3[s1-i]=arr1[i]-'0';//将字符串的数字反向存储到整形数组中,使arr3[1]是个位上的数
}
i=0;
for(;i<s2;i++)
{
arr4[s2-i]=arr2[i]-'0';
}

之后就是经典的小学运算了。运算方式如下
1
2
3
4
5
6
7
8
9
//设arr1与arr2为已经转换为整型数组的数组
if(arr1[i]<aarr2[i])
{
arr1[i+1]--;
arr[i]+=10;
}
arr3[i]=arr3[i]+arr1[i]-arr2[i];
arr3[i+1]=arr3[i]/10;
arr3[i]=arr[i]%10

将以上代码结合起来就是高精度减法的全部了。
1
2
3
4
5