当前位置:   article > 正文

C++实现大数据乘法_c++设计一个函数实现大数据相乘,比如

c++设计一个函数实现大数据相乘,比如

1.测试环境 vs2013 windows 7

采用累乘的方式实现,然后再统一的进位,最后将其在转换为字符串,输出。

程序代码:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<iostream>
  3. struct BigDataMutliplie
  4. {
  5. private:
  6. char data_a[100];
  7. char data_b[100];
  8. int len_a;
  9. int len_b;
  10. bool negative;
  11. bool detect_data()
  12. {
  13. len_a = strlen(data_a);
  14. len_b = strlen(data_b);
  15. if (len_a == 0 || len_b == 0)
  16. {
  17. return false;
  18. }
  19. for (int i = 0; i < len_a; i++)
  20. {
  21. if (!(data_a[i] >= '0'&&data_a[i] <= '9'))
  22. {
  23. return false;
  24. }
  25. }
  26. for (int i = 0; i < len_b; i++)
  27. {
  28. if (!(data_b[i] >= '0'&&data_b[i] <= '9'))
  29. {
  30. return false;
  31. }
  32. }
  33. }
  34. public:
  35. BigDataMutliplie()
  36. {
  37. memset(data_a, 0, sizeof(data_a));
  38. memset(data_b, 0, sizeof(data_b));
  39. len_a = 0;
  40. len_b = 0;
  41. }
  42. bool init_data(const char *data_a, const char *data_b)
  43. {
  44. this->negative = false;
  45. if (!data_a || !data_b)
  46. {
  47. return false;
  48. }
  49. if (*data_a == '-' || *data_a == '+')
  50. {
  51. strcpy(this->data_a, data_a + 1);
  52. if (*data_a == '-')
  53. {
  54. negative = !negative;
  55. }
  56. }
  57. else
  58. {
  59. strcpy(this->data_a, data_a);
  60. }
  61. if (*data_b == '-' || *data_b == '+')
  62. {
  63. strcpy(this->data_b, data_b + 1);
  64. if (*data_b == '-')
  65. {
  66. negative = !negative;
  67. }
  68. }
  69. else
  70. {
  71. strcpy(this->data_b, data_b);
  72. }
  73. }
  74. char * multiplie_ab()
  75. {
  76. if (!detect_data())
  77. {
  78. return NULL;
  79. }
  80. int * int_res = new int[(len_a + len_b)*sizeof(int)];//两个数相乘最大不会超过两个数的个数相加99*99
  81. char * str_res = new char[(len_a + len_b + 2)*sizeof(char)]; //多申请两个字符的空间 一个存符号,一个存'\0'
  82. memset(str_res, 0, (len_a + len_b + 2)*sizeof(char));
  83. memset(int_res, 0, (len_a + len_b)*sizeof(int));
  84. //采取累乘的方式然后再统一进位
  85. for (int i = 0; i < len_a; i++)
  86. for (int j = 0; j < len_b; j++)
  87. {
  88. int_res[i + j + 1] += (data_a[i] - '0')*(data_b[j] - '0'); //第一位预留出来用于保存符进位
  89. }
  90. //处理进位
  91. for (int index = len_a + len_b + 2 - 1; index >= 0; index--)
  92. {
  93. if (int_res[index] >= 10)
  94. {
  95. int_res[index - 1] += int_res[index] / 10;
  96. int_res[index] = int_res[index] % 10;
  97. }
  98. }
  99. int j = 0, i = 0;
  100. while (int_res[j] == 0) // 找到开始不为0的位置
  101. {
  102. j++;
  103. }
  104. if (negative)
  105. {
  106. str_res[i++] = '-';
  107. }
  108. //int_res 数组是从0-len_a + len_b
  109. //str_res 是从除去符号位开始到len_a + len_b + 1
  110. for (; i < (len_a + len_b + 1) && j < (len_a + len_b); i++, j++)
  111. {
  112. str_res[i] = int_res[j] + '0';
  113. }
  114. str_res[len_a + len_b + 1] = '\0';
  115. delete[] int_res;
  116. return str_res;
  117. }
  118. };
  119. void main()
  120. {
  121. BigDataMutliplie data;
  122. char *data_a = "-9999999999999";
  123. char *data_b = "999";
  124. char *str_res;
  125. data.init_data(data_a, data_b);
  126. str_res = data.multiplie_ab();
  127. if (str_res)
  128. {
  129. std::cout << data_a << " * " << data_b << " = " << str_res << std::endl;
  130. delete[] str_res;
  131. }
  132. data_a = "-87654321";
  133. data_b = "+12345678";
  134. data.init_data(data_a, data_b);
  135. str_res = data.multiplie_ab();
  136. if (str_res)
  137. {
  138. std::cout << data_a << " * " << data_b << " = " << data.multiplie_ab() << std::endl;
  139. delete[] str_res;
  140. }
  141. data_a = "-314123123123123";
  142. data_b = "-64356343653564";
  143. data.init_data(data_a, data_b);
  144. str_res = data.multiplie_ab();
  145. if (str_res)
  146. {
  147. std::cout << data_a << " * " << data_b << " = " << data.multiplie_ab() << std::endl;
  148. delete[] str_res;
  149. }
  150. system("pause");
  151. }



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/818500
推荐阅读
相关标签
  

闽ICP备14008679号