【转】传统的高精度算法

  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

 

posted @ 2013-08-05 12:28  Geekers  阅读(185)  评论(0编辑  收藏  举报