程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++實現大數據乘法

C++實現大數據乘法

編輯:C++入門知識

C++實現大數據乘法


1.測試環境 vs2013 windows 7

采用累乘的方式實現,然後再統一的進位,最後將其在轉換為字符串,輸出。

程序代碼:

 

#define _CRT_SECURE_NO_WARNINGS
#include


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

 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved