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

5、大数,高精度计算---大数减法

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

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

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

一 ?大数减法。

大数减法的处理思路和加法差不多。先判断a,b两数的大小,然后按条件进行逐位计算,并且处理借位。此时借位的条件是某位的值小于0,则往前借位。

思路很常规,也不难,直接上代码。

水平有限,现在只能写出这样比较麻烦的算法。?? 希望。以后有能力了,有时间了再去优化。

?

[cpp]? view plain copy
  1. #include<stdio.h>??
  2. #include<string.h>??
  3. ??
  4. int?compare(char?*str_a,char?*str_b)??
  5. {??
  6. ????int?len_a,?len_b;??
  7. ????len_a?=?strlen(str_a);??????????//分别获取大数的位数进行比较??
  8. ????len_b?=?strlen(str_b);??
  9. ????if?(?strcmp(str_a,?str_b)?==?0?)????//返回比较结果??
  10. ????????return?0;??
  11. if?(?len_a?>?len_b?)??
  12. return?1;??
  13. else?if(?len_a?==?len_b?)??
  14. return?strcmp(str_a,?str_b);??
  15. else??
  16. return?-1;??
  17. }??
  18. int?main()??
  19. int?f,?n;??
  20. ????int?i,?k,?len_a,?len_b;??
  21. char?str_a[1000],?str_b[1000];??
  22. int?num_a[1000]?=?{0};??????????//初始化大数数组,各位全清0??
  23. int?num_b[1000]?=?{0};??
  24. int?num_c[1000];??
  25. ??
  26. ????while?(scanf("%s%s",str_a,str_b)!=?EOF)?//可进行多组测试??
  27. ????{??
  28. ????????len_a?=?strlen(str_a);?????????//分别获得两个大数的位数??
  29. ????????len_b?=?strlen(str_b);??
  30. ????????k?=?len_a?>?len_b??len_a:len_b;????????????????????//获得最大的位数??
  31. ????????num_c[0]?=?0;??
  32. ????????f?=?0;??
  33. ????????n?=?compare(str_a,str_b);??
  34. for?(i=0;i<len_a;i++)???????????????????//颠倒存储??
  35. ????????????num_a[i]?=?str_a[len_a-i-1]?-?'0';??
  36. for?(i=0;i<len_b;i++)??
  37. ????????????num_b[i]?=?str_b[len_b-i-1]?-?'0';??
  38. ????????for?(i=0;i<k;i++)?????????//逐位进行减法??
  39. ????????{??
  40. ????????????if?(n>=0)??
  41. ????????????{??
  42. ????????????????if?(num_a[i]?>=?num_b[i])??
  43. ????????????????????num_c[i]?=?num_a[i]?-?num_b[i];??
  44. ????????????????{??
  45. ????????????????????num_c[i]?=?num_a[i]?-?num_b[i]?+?10;??
  46. ????????????????????num_a[i+1]--;??
  47. ????????????????}??
  48. ????????????}??
  49. if?(?num_b[i]?>=?num_a[i])??
  50. ????????????????????num_c[i]?=?num_b[i]?-?num_a[i];??
  51. ????????????????????num_c[i]?=?num_b[i]?-?num_a[i]?+?10;??
  52. ????????????????????num_b[i+1]--;??
  53. ????????}??
  54. if?(n<0)????????????//按要求打印??
  55. ????????????printf("-");??
  56. for?(i=k-1;?i>=0;?i--)??
  57. ????????{??
  58. ????????????if?(num_c[i])??
  59. ????????????????f?=?1;??
  60. if?(f?||?i?==?0?)??
  61. ????????????????printf("%d",num_c[i]);??
  62. ????????printf("n");??
  63. for?(i=0;i<k;i++)???????????????//清0.?进行下一次操作??
  64. ????????????num_a[i]?=?0;??
  65. ????????????num_b[i]?=?0;??
  66. ????}??
  67. return?0;??
  68. }??

(编辑:李大同)

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

    推荐文章
      热点阅读