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");
}