1 大家都知道,C语言的基本数据类型提供的可计算范围非常有限的
2 那么我们需要处理大数据时怎么办呢
3 其实有一种方法可以很轻松的解决这个问题
4 那就是高精度算法。
5
6 首先,我们介绍整数的高精度加法
7
8 算法的思路:
9 模拟我们在小学所学的笔算
10 (对于不足位用0补齐,如9818+13,我们认为是9818+0013)
11 假设我们要计算的两数分别是 A1 A2 A3 A4 、 B1 B2 B3 B4
12 那么我们笔算时,会列出这样的式子
13
14 A1 A2 A3 A4
15 + B1 B2 B3 B4
16 ---------------------
17 C0 C1 C2 C3 C4
18
19 那么我们在计算机中也同样可以完成这个过程
20 为了方便进位,我们在计算前,将两个数反向储存至数组中
21 即我们是对 B4 B3 B2 B1 、A4 A3 A2 A1 进行计算
22
23 初始化时 dv = 0
24 其中有恒等式 Cn = (An + Bn + dv)mod 10 (dv为进位结果)
25 根据这个等式我们只需要循环执行以下三步,就能得到大致结果
26
27 1. temp = An + Bn +dv
28 2. Cn = temp mod 10
29 3. dv = temp div 10
30
31 循环完成后,我们还需要进行最后一步
32 因为两个最高位相加仍可能产生进位
33 所以,我们在这里还要额外做一次对 dv 的判断
34 如果 dv 值为 1 的话, Cn+1 应该要进位,即 Cn+1 = 1
35
36
1 #include<stdio.h>
2 #include<string.h>
3 #define MAX 1001
4 int main(void)
5 {
6 int arr1[MAX]={0},arr2[MAX]={0};
7 int length,i,length1,length2,t,dv = 0;
8 char str[MAX];
9 /*读入数据,并进行预处理(计算出数字位数,并方向存放)*/
10 scanf("%s",str);
11 length1 = strlen(str);
12 for(i=0; i<length1; ++i)
13 arr1[i] = str[length1-1-i] - '0';
14 scanf("%s",str);
15 length2 = strlen(str);
16 for(i=0; i<length2; ++i)
17 arr2[i] = str[length2-1-i] - '0';
18 length = (length1>length2)?length1:length2;
19 /*算法核心内容*/
20 for(i=0; i<length; ++i)
21 {
22 t = arr1[i] + arr2[i] +dv;
23 arr1[i] = t % 10;
24 dv = t / 10;
25 }
26 if(dv != 0) arr1[length++] = dv;
27 /*结束*/
28 for(i=0; i<length; ++i)
29 printf("%d",arr1[length-1-i]);
30 return 0;
31 }
101
102 作者:Aem
103 本文版权归作者和www.aemiot.com共有,未征得作者本人同意之前,请勿将本文内容用于任何商业用途。 欢迎非商业用途转载,但请在明显位置注明本文作者和出处链接,否则我们保留追究法律责任的权利。
104 本文链接:http://www.aemiot.com/calc-high-int-sum.html