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

大数问题:用字符串解决大数相加和相乘。

发布时间:2020-12-14 04:09:47 所属栏目:大数据 来源:网络整理
导读:? 大数问题:用字符串解决大数相加和相乘。 分类:?数据结构和算法 2008-03-03 08:44 ? 4349人阅读 ? 评论(5) ? 收藏 ? 举报 c 算法 面试 在ACM的题目中经常会遇到大数相加和相乘的问题,在有些公司的面试题中也有暗含要用大数才能解决的问题。比如:输入三
?

大数问题:用字符串解决大数相加和相乘。

分类:?数据结构和算法 ? 4349人阅读? 评论(5)? 收藏? 举报
c 算法 面试

在ACM的题目中经常会遇到大数相加和相乘的问题,在有些公司的面试题中也有暗含要用大数才能解决的问题。比如:输入三个整数,写一个程序判断这个三个整数能否构成一个直角三角形。此题算法很简单,但是却暗含着结果可能溢出的问题。如果不会用大数,此题就无法给出完美的答案。

下面给出大数的乘法和加法算法:

1、加法:

// ?assume?m?is?bigger?than?n.
char * ?add( ? a,? b,255)">int ?m,0)">?n)
{
????
?为结果分配内存空间。 ???? c? = ?( )malloc((m? + 2 ) sizeof ( ));
????memset(c,0)">0
,?(m? )? ));
????
?将字符(0?+?0x30?到?9?+?0x30)转换为数字(0到9)进行计算。 for ?i? ?n? - 1 ;?j? >= ;? -- i,0)">j)
????????c[i]?
+= ?(b[j]? 0x30 );
????
?m? j)
????{
????????c[i]?
?(a[j]? );
????????
if ?(c[i]? > 9 )
????????{
????????????c[i?
]? ;
????????????c[i]?
-= 10 ;
????????}
????}
????
?将由纯数字组成的结果转换为字符串,并去除首部可能还存在的零。
???c[m + 1] = '/0'; ;?i? != ++ i)
????????c[i]?
;
????
?(c[ == )
????????
;?c[i] != '/0';? i)
????????????c[i]?
?c[i? ];
????
?返回结果所在内存单元的首地址。 return ?c;
}

2、乘法:

?mult( ));

????
r)
????{
????????
?j? ?r;?j? j,0)">k)
????????{
????????????c[k]?
?(a[i]? );
????????????
?tmp? ?c[k]? / ;
????????????
?(tmp? )
????????????{
????????????????c[k?
?tmp;
????????????????c[k]?
;
????????????}
????????}
????}

????
?将由纯数字组成的结果转换为字符串,并去除首部可能还存在的零。 ????c[m + n] = '/0';
????
?n;? ;
;??c[i] != '/0';? ];

????
?c;
}

[cpp]? view plain copy
  1. #include?<stdio.h>??
  2. #include?<stdlib.h>??
  3. #include?<string.h>??
  4. #include?<assert.h>??
  5. ??
  6. //?assume?m?is?bigger?than?n.??
  7. char*?mult(char?*a,?char?*b,87); background-color:inherit; font-weight:bold">int?m,87); background-color:inherit; font-weight:bold">int?n)?{??
  8. ????int?g?=?m?+?n;??
  9. ????//?为结果分配内存空间。??
  10. char?*c?=?(char*)malloc(g?*?sizeof(char));??
  11. ????memset(c,?0,?g?*?char));??
  12. ??
  13. ????c[g?-?1]?=?'';??
  14. ????//?将字符(0?+?0x30?到?9?+?0x30)转换为数字(0到9)进行计算。??
  15. ????for?(int?i?=?m?-?1,?r?=?g?-?2;?i?>=?0;?--i,?--r)?{??
  16. ????????int?j?=?n?-?1,?k?=?r;?j?>=?0;?--j,?--k)?{??
  17. ????????????c[k]?+=?(a[i]?-?0x30)?*?(b[j]?-?0x30);??
  18. ????????????int?tmp?=?c[k]?/?10;??
  19. ????????????if?(tmp?>=?1)?{??
  20. ????????????????assert(k?-?1?>=?0);??
  21. ????????????????c[k?-?1]?+=?tmp;??
  22. ????????????????c[k]?-=?tmp?*?10;??
  23. ????????????}??
  24. ????????}??
  25. ????}??
  26. //?将由纯数字组成的结果转换为字符串,并去除首部可能还存在的零。??
  27. ????int?i?=?0;?i?!=?g?-?1;?++i)??
  28. ????????c[i]?+=?0x30;??
  29. if?(c[0]?==?0x30)??
  30. ????????int?i?=?0;?c[i]?!=?'';?++i)??
  31. ????????????c[i]?=?c[i?+?1];??
  32. //?返回结果所在内存单元的首地址。??
  33. return?c;??
  34. }??
  35. void?test(char*?a,87); background-color:inherit; font-weight:bold">char*?b)?{??
  36. int?i?=?0;?a[i]?!=?'';?++i)?{??
  37. if?(a[i]?!=?b[i])?{??
  38. ????????????printf("%d?%c?%cn",?i,?a[i],?b[i]);??
  39. ????????assert(a[i]?==?b[i]);??
  40. ????}??
  41. }??
  42. int?main()?{??
  43. char?a[1024]?=?"123";??
  44. ????char?b[1024]?=?"1";??
  45. ????printf("123?*?1n");??
  46. char*?c?=?mult(a,?b,?3,?1);??
  47. ????test(c,?"123");??
  48. ????free(c);??
  49. ????strcpy(b,?"12");??
  50. ????printf("123?*?12n");??
  51. ????c?=?mult(a,?2);??
  52. "1476");??
  53. "123");??
  54. ????printf("123?*?123n");??
  55. "15129");??
  56. ????strcpy(a,?"123456789123456789");??
  57. ????strcpy(b,?"123456789123456789");??
  58. ????printf("123456789123456789?*?123456789123456789n");??
  59. ????c?=?mult(a,?18,?18);??
  60. ????test(c,?"15241578780673678515622620750190521");??
  61. ????free(c);??
  62. ????strcpy(a,?"12345678912345678");??
  63. ????printf("123456789123456789?*?12345678912345678n");??
  64. "1524157878067367740451151863907942");??
  65. "1234567891234567");??
  66. ????printf("123456789123456789?*?1234567891234567n");??
  67. "152415787806736675279683887625363");??
  68. return?0;??
  69. }??

(编辑:李大同)

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

    推荐文章
      热点阅读