【转】传统的高精度算法
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