C++实现大数据乘法

时间:2015-05-15 09:05:14   收藏:0   阅读:141

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");
}
技术分享


评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!