zoukankan      html  css  js  c++  java
  • 【转】传统的高精度算法

      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
  • 相关阅读:
    DockerFile自定义简单的镜像
    error: rpmdb: BDB0113 Thread/process 11524/140156910634816 failed: BDB1507 Thread died in Berkeley DB library
    Docker--privileged的作用
    MySQL---‘PRIMARY KEY’的使用
    DockerFile----CMD和ENTRYPOINT区别案例
    WARNING: IPv4 forwarding is disabled. Networking will not work.
    查询出数据库表中字段名
    查询出数据库表中字段名
    jquery复制当前tr行
    jquery复制当前tr行
  • 原文地址:https://www.cnblogs.com/Lee-geeker/p/3237947.html
Copyright © 2011-2022 走看看