赞
踩
1.测试环境 vs2013 windows 7
采用累乘的方式实现,然后再统一的进位,最后将其在转换为字符串,输出。
程序代码:
- #define _CRT_SECURE_NO_WARNINGS
- #include<iostream>
-
-
- struct BigDataMutliplie
- {
- private:
- char data_a[100];
- char data_b[100];
- int len_a;
- int len_b;
- bool negative;
- bool detect_data()
- {
- len_a = strlen(data_a);
- len_b = strlen(data_b);
- if (len_a == 0 || len_b == 0)
- {
- return false;
- }
- for (int i = 0; i < len_a; i++)
- {
- if (!(data_a[i] >= '0'&&data_a[i] <= '9'))
- {
- return false;
- }
- }
-
- for (int i = 0; i < len_b; i++)
- {
- if (!(data_b[i] >= '0'&&data_b[i] <= '9'))
- {
- return false;
- }
- }
- }
- public:
- BigDataMutliplie()
- {
- memset(data_a, 0, sizeof(data_a));
- memset(data_b, 0, sizeof(data_b));
- len_a = 0;
- len_b = 0;
- }
- bool init_data(const char *data_a, const char *data_b)
- {
- this->negative = false;
- if (!data_a || !data_b)
- {
- return false;
- }
- if (*data_a == '-' || *data_a == '+')
- {
- strcpy(this->data_a, data_a + 1);
- if (*data_a == '-')
- {
- negative = !negative;
- }
- }
- else
- {
- strcpy(this->data_a, data_a);
- }
- if (*data_b == '-' || *data_b == '+')
- {
- strcpy(this->data_b, data_b + 1);
- if (*data_b == '-')
- {
- negative = !negative;
- }
- }
- else
- {
- strcpy(this->data_b, data_b);
- }
- }
- char * multiplie_ab()
- {
- if (!detect_data())
- {
- return NULL;
- }
- int * int_res = new int[(len_a + len_b)*sizeof(int)];//两个数相乘最大不会超过两个数的个数相加99*99
- char * str_res = new char[(len_a + len_b + 2)*sizeof(char)]; //多申请两个字符的空间 一个存符号,一个存'\0'
- memset(str_res, 0, (len_a + len_b + 2)*sizeof(char));
- memset(int_res, 0, (len_a + len_b)*sizeof(int));
- //采取累乘的方式然后再统一进位
- for (int i = 0; i < len_a; i++)
- for (int j = 0; j < len_b; j++)
- {
- int_res[i + j + 1] += (data_a[i] - '0')*(data_b[j] - '0'); //第一位预留出来用于保存符进位
- }
-
- //处理进位
- for (int index = len_a + len_b + 2 - 1; index >= 0; index--)
- {
- if (int_res[index] >= 10)
- {
- int_res[index - 1] += int_res[index] / 10;
- int_res[index] = int_res[index] % 10;
- }
-
- }
-
- int j = 0, i = 0;
-
- while (int_res[j] == 0) // 找到开始不为0的位置
- {
- j++;
- }
-
- if (negative)
- {
- str_res[i++] = '-';
- }
- //int_res 数组是从0-len_a + len_b
- //str_res 是从除去符号位开始到len_a + len_b + 1
- for (; i < (len_a + len_b + 1) && j < (len_a + len_b); i++, j++)
- {
- str_res[i] = int_res[j] + '0';
- }
- str_res[len_a + len_b + 1] = '\0';
- delete[] int_res;
- return str_res;
- }
- };
-
- void main()
- {
- BigDataMutliplie data;
- char *data_a = "-9999999999999";
- char *data_b = "999";
- char *str_res;
- data.init_data(data_a, data_b);
- str_res = data.multiplie_ab();
- if (str_res)
- {
- std::cout << data_a << " * " << data_b << " = " << str_res << std::endl;
- delete[] str_res;
- }
-
-
- data_a = "-87654321";
- data_b = "+12345678";
- data.init_data(data_a, data_b);
- str_res = data.multiplie_ab();
- if (str_res)
- {
- std::cout << data_a << " * " << data_b << " = " << data.multiplie_ab() << std::endl;
- delete[] str_res;
- }
- data_a = "-314123123123123";
- data_b = "-64356343653564";
- data.init_data(data_a, data_b);
- str_res = data.multiplie_ab();
-
- if (str_res)
- {
- std::cout << data_a << " * " << data_b << " = " << data.multiplie_ab() << std::endl;
- delete[] str_res;
- }
- system("pause");
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。