加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

4、 大数,高精度计算---大数加法

发布时间:2020-12-14 03:32:19 所属栏目:大数据 来源:网络整理
导读:大数是算法语言中的数据类型无法表示的数,其位数超过最大数据类型所能表示的范围,所以,在处理大数问题时首先要考虑的是怎样存储大数,然后是在这种存储方式下其处理的实现方法。 一般情况下大数的存储是采用字符数组来存储,即将大数当作一个字符串来存储

大数是算法语言中的数据类型无法表示的数,其位数超过最大数据类型所能表示的范围,所以,在处理大数问题时首先要考虑的是怎样存储大数,然后是在这种存储方式下其处理的实现方法。

一般情况下大数的存储是采用字符数组来存储,即将大数当作一个字符串来存储,而对其处理是按其处理规则在数组中模拟实现。


一 ?大数加法。

思路很常规。先用字符数组录入大数,(这个时候高位存在数组下标小的位置。 ?如:最高位在arr[0]处。 ?---输入方式原因) ?

然后再从高往低反向存入整数数组中。(使得低位在数组下标小的位置,符合常规。)

然后在进行计算,考虑进位情况。

加法比较简单,就不多说什么了。 ?直接上代码。


[cpp]? view plain copy
  1. #include?<stdio.h>??
  2. #include?<string.h>??
  3. #define?MAXLEN?1000??
  4. ??
  5. int?main()??
  6. {??
  7. ????char?a1[MAXLEN];??
  8. ????char?a2[MAXLEN];??
  9. ????static?int?v1[MAXLEN];??
  10. ????int?v2[MAXLEN];??
  11. int?v3[MAXLEN];??
  12. int?i,j,n,L,z;??
  13. ??
  14. ????scanf("%d",&n);??????//读入计算的组数??
  15. for?(j=0;j<n;j++)??
  16. ????{??
  17. ????????scanf("%s%s",a1,a2);???//读入每组计算的2个大数??
  18. ????????L=strlen(a1);??
  19. ????????for?(i=0;i<L;i++)??
  20. ????????????v1[i]=a1[L-1-i]-'0';??????//大数a1反向??
  21. ????????L=strlen(a2);??
  22. ????????????v2[i]=a2[L-1-i]-'0';???//大数a2反向??
  23. ????????for?(i=0;i<MAXLEN;i++)??
  24. ????????????v3[i]=v1[i]+v2[i];???????//a1.a2各位直接相加,先不考虑进位??
  25. for?(i=0;i<MAXLEN;i++)??
  26. ????????{??
  27. ????????????if?(v3[i]>=10)??
  28. ????????????{??
  29. ????????????????v3[i+1]+=v3[i]/10;??????//对每位进行进位处理??
  30. ????????????????v3[i]=v3[i]%10;??
  31. ????????????}??
  32. ????????}??
  33. ????????printf("Case?%d:n",?j+1);??
  34. ????????printf("%s?+?%s?=?",?a1,?a2);??
  35. ????????z=0;??
  36. for?(i=MAXLEN-1;i>=0;i--)???????????//打印??
  37. ????????{??
  38. ????????????if?(z==0)??
  39. ????????????{??
  40. ????????????????if?(v3[i]!=0)??
  41. ????????????????{??
  42. ????????????????????printf("%d",v3[i]);??
  43. ????????????????????z=1;??
  44. ????????????????}??
  45. else??
  46. ????????????????printf("%d",153); background-color:inherit; font-weight:bold">if?(z==0)?printf("0");??
  47. ????????printf("n");??
  48. ????}??
  49. return?0;??
  50. }??


其实,上述代码还能进一步简化,合并操作步骤。

可以将大数的颠倒过程和求和运算过程合并,颠倒的过程是逐位移动到整数数组的过程,在移位的过程中,同时实现运算,但此时依旧先不考虑进位,所有各位的进位都在计算完成后统一处理。


copy
    int?main()??
  1. {??
  2. char?s[202];????//??假设大数不超过200位。????
  3. int?sum[201];??
  4. for?(i=0;i<201;i++)????????//对各位和进行初始化??
  5. ????{??
  6. ????????sum[i]?=?0;??
  7. for?(i=0;i<2;i++)???//?读入两个大数??
  8. ????????scanf("%s",?s);??
  9. ????????len?=?strlen(s);??
  10. if?(len>maxlen)??
  11. ????????????maxlen?=?len;??
  12. for?(j=len-1;j>=0;j--)??
  13. ????????????sum[len-1-j]?+=?s[j]?-?'0';?????????//颠倒求和,存入结果数组sum中??
  14. ????}??
  15. for?(i=0,d=0;i<maxlen;i++)???//从低位开始处理结果中的进位??
  16. ????????sum[i]?+=?d;??
  17. ????????d?=?sum[i]?/?10;??
  18. ????????sum[i]?%=?10;??
  19. if?(d>0)??
  20. ????????sum[maxlen++]?+=?d;?????????//如果最后一个有进位,再往前挪一位??
  21. for?(i=maxlen-1;i>=0;i--)??
  22. ????????s[maxlen-1-i]?=?sum[i]?+?'0';???????//结果以字符串方式保存??
  23. ????s[maxlen]?=?'';??
  24. ????printf("%sn",s);?????????//输出结果??
  25. }??

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读