❤️算法「高精度整数加法、减法、除法、乘法」

目录

高精度加法

高精度减法

高精度乘法

高精度除法


在执行高精度数运算时,因为溢出问题,整数不能直接用基本类型表示。通常思路是将整数存在字符串中,模拟算术运算进行处理,结果返回正确运算结果的字符串。

高精度加法

const int BASE = 10;//进制 为10则是以十进制运算

//返回a+b 
string add(string a, string b) 
{
	string ret;
	int index_a = a.size()-1, index_b = b.size()-1, carry = 0;
	int add_a = 0, add_b = 0;
	while (index_a>=0 || index_b >=0)
	{
		add_a = index_a >= 0 ? a[index_a--]-'0' : 0;
		add_b = index_b >= 0 ? b[index_b--]-'0' : 0;
		int sum = add_a + add_b + carry;
		if (sum >= BASE)
		{
			carry = 1;
			sum %= BASE;
		}
		else carry = 0;
		ret.push_back(sum+'0');
	}
	if (carry) ret.push_back('1');
	reverse(ret.begin(), ret.end());

	return ret;
}

高精度减法

//比较 a,b的大小
int cmp(string a, string b)
{
	if (a.size() != b.size()) return a.size() - b.size();
	for (int i = 0; i < a.size(); i++)
		if (a[i] != b[i]) return a[i] -= b[i];

	return 0;
}
//返回 a-b 的值
string sub(string a, string b)
{
	int flag = 0;
	if (cmp(a, b) < 0)
	{
		swap(a, b);
		flag = 1;
	}
	string ret;
	if (cmp(a, b) == 0)
	{
		ret.push_back('0');
		return ret;
	}
	int index_a = a.size() - 1, index_b = b.size() - 1;
	int sub_a, sub_b, t = 0;
	while (index_a >= 0)
	{
		sub_a = a[index_a--] - '0', sub_b = index_b>=0?b[index_b--] - '0':0;
		int num =sub_a-t-sub_b;
		if (num < 0)
		{
			num += BASE;
			t = 1;
		}
		else t = 0;

		ret.push_back(num + '0');
	}
	while (ret.size() > 1 && ret.back() == '0') ret.pop_back();
	if(flag) ret.push_back('-');
	reverse(ret.begin(), ret.end());
	return ret;
}

高精度乘法

string mul(string a, int b)
{
	string ret;
	int t = 0;
	for (int i = a.size() - 1; i >= 0 || t!=0; i--)
	{
		if (i >= 0) t += (a[i]-'0') * b;
		ret.push_back(t%BASE+'0');
		t /= BASE;
	}

	reverse(ret.begin(), ret.end());
	return ret;
}

高精度除法

//返回a/b. c:余数
string div(string a, int b,int &c)
{
	string ret;
	int t = 0;
	for (int i = 0; i <a.size(); i++)
	{
		t = t * BASE +(a[i]-'0');
		ret.push_back(t / b+'0');
		t %= b;
	}
	c = t;
	reverse(ret.begin(), ret.end());
	while (ret.size() > 1 && ret.back() == '0') ret.pop_back();
	reverse(ret.begin(), ret.end());

	return ret;
}

猜你喜欢

转载自blog.csdn.net/weixin_40582034/article/details/119709203