c++高精度加法乘法

写在前面:

在处理某些大数问题,尤其很多时候我们无法使用int,long long等类型来存储时,我们会考虑使用大数算法,也就是高精度算法,来扩大我们数据的存储量级。本篇文章我们就浅谈一下高精度算法中的加法和乘法问题。

经过一段时间的c++学习后,我们会发现各种数据类型的优缺点,比如string类型适合存储很大的数据,但不适合直接进行数值运算,而int类型数组适合来进行数值运算。

因此在高精度算法中,我们常见思路为:用string类型来输入数据,再将string类型转换为int类型的数组中进行运算。

具体形式如下:

高精度加法:

string addfunc(string a, string b)
{
	int arra[250], arrb[250];
	memset(arra, 0, sizeof(arra));
	memset(arrb, 0, sizeof(arrb));
	arra[0] = a.length();
	arrb[0] = b.length();
	for (int i = 1; i <= arra[0]; i++)
	{
		arra[i] = a[arra[0] - i]-'0';
	}
	for (int i = 1; i <= arrb[0]; i++)
	{
		arrb[i] = b[arrb[0] - i]-'0';
	}
	int len = max(arra[0], arrb[0]);
	for (int i = 1; i <= len; i++)
	{
		arra[i] += arrb[i];
		arra[i + 1] += arra[i] / 10;
		arra[i] %= 10;
	}
	if (arra[len + 1] != 0)
		len++;
	string ans="";
	for (int i = len; i >= 1; i--)
	{
		ans += to_string(arra[i]);
	}
	return ans;
}

高精度乘法:

string funcmultiply(string a, string b)
{
	int arra[250], arrb[250];
	memset(arra, 0, sizeof(arra));
	memset(arrb, 0, sizeof(arrb));
	int ans[500];
	memset(ans, 0, sizeof(ans));
	arra[0] = a.length();
	arrb[0] = b.length();
	for (int i = 1; i <= arra[0]; i++)
	{
		arra[i] = a[arra[0] - i]-'0';
	}
	for (int i = 1; i <= arrb[0]; i++)
	{
		arrb[i] = b[arrb[0] - i]-'0';
	}
	int len = arra[0] + arrb[0] - 1;//最少为len位,但有可能会是len+1
	
	for (int i = 1; i <= arra[0]; i++)
	{
		for (int j = 1; j <= arrb[0]; j++)
		{
			ans[i + j - 1] += arra[i] * arrb[j];
			ans[i + j] += ans[i + j - 1] / 10;
			ans[i + j - 1] %= 10;
		}
	}
	if (ans[len + 1] != 0)
		len++;
	string str;
	for (int i = len; i >= 1; i--)
	{
		str += to_string(ans[i]);
	}
	return str;
}

你可能感兴趣的:(c++编码,c++,算法,数据结构,leetcode)