高精度加法与高精度乘法模板

发布时间 2023-08-22 01:05:16作者: susenyang
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
const int MAXN = 105;//最大位数
class HA
{//高精度数字
public:
	char data[MAXN];
	int len;
public:
	HA();
	HA(long long num);
	friend HA operator + (const HA& a, const HA& b);
	friend HA operator + (const HA& a, long long num);
	friend HA operator * (const HA& a, const HA& b);
	friend HA operator * (const HA& a, long long num);
	friend bool operator < (const HA& a, const HA& b);
	friend bool operator > (const HA& a, const HA& b);
	friend ostream& operator << (ostream& out, const HA& ha);
	friend istream& operator >> (istream& in, HA& ha);
};

HA::HA()
{
	memset(data, '0', sizeof(data));
	len = 0;
}

HA::HA(long long num)
{
	memset(data, '0', sizeof(data));
	len = 0;
	if (num == 0)
	{
		data[0] = '0';
		len = 1;
		return;
	}
	while (num)
	{
		data[len++] = num % 10 + 48;
		num /= 10;
	}
}


HA operator + (const HA& a, const HA& b)
{
	HA c;
	int maxlen = max(a.len, b.len);
	int* numa = (int*)calloc(maxlen, sizeof(int));
	int* numb = (int*)calloc(maxlen, sizeof(int));
	int* numc = (int*)calloc(maxlen + 1, sizeof(int));
	for (int i = 0; i < maxlen; i++)
	{
		numa[i] = a.data[i] - 48;
	}
	for (int i = 0; i < maxlen; i++)
	{
		numb[i] = b.data[i] - 48;
	}
	for (int i = 0; i < maxlen; i++)
	{
		numc[i] += numa[i] + numb[i];
		if (numc[i] >= 10)
		{
			numc[i + 1] += numc[i] / 10;
			numc[i] %= 10;
		}
	}
	for (int i = 0; i <= maxlen; i++)
	{
		c.data[i] += numc[i];
	}
	c.len = 1;
	for (int i = maxlen; i >= 0; i--)
	{
		if (c.data[i] != '0')
		{
			c.len = i + 1;
			break;
		}
	}

	return c;
}

HA operator + (const HA& a, long long num)
{
	HA b = num;
	return a + b;
}

HA operator * (const HA& a, const HA& b)
{
	HA c;
	int* numa = (int*)calloc(a.len, sizeof(int));
	int* numb = (int*)calloc(b.len, sizeof(int));
	int* numc = (int*)calloc(a.len + b.len, sizeof(int));
	for (int i = 0; i < a.len; i++)
	{
		numa[i] = a.data[i] - 48;
	}
	for (int i = 0; i < b.len; i++)
	{
		numb[i] = b.data[i] - 48;
	}
	for (int i = 0; i < a.len; i++)
	{
		for (int j = 0; j < b.len; j++)
		{
			numc[i + j] += numa[i] * numb[j];
			if (numc[i + j] >= 10)
			{
				numc[i + j + 1] += numc[i + j] / 10;
				numc[i + j] %= 10;
			}
		}
	}
	for (int i = 0; i < a.len + b.len; i++)
	{
		c.data[i] += numc[i];
	}
	c.len = 1;
	for (int i = a.len + b.len - 1; i >= 0; i--)
	{
		if (c.data[i] != '0')
		{
			c.len = i + 1;
			break;
		}
	}
	free(numa);
	free(numb);
	free(numc);
	return c;
}

HA operator * (const HA& a, long long num)
{
	HA b = num;
	return a * b;
}

bool operator < (const HA& a, const HA& b)
{
	if (a.len == b.len)
	{
		for (int i = a.len - 1; i >= 0; i--)
		{
			if (a.data[i] != b.data[i])
			{
				return a.data[i] < b.data[i];
			}
		}
		return 0;
	}
	else
	{
		return a.len < b.len;
	}
}

bool operator < (const HA& a, long long num)
{
	HA b = num;
	if (a.len == b.len)
	{
		for (int i = a.len - 1; i >= 0; i--)
		{
			if (a.data[i] != b.data[i])
			{
				return a.data[i] < b.data[i];
			}
		}
		return 0;
	}
	else
	{
		return a.len < b.len;
	}
}

bool operator < (long long num, const HA& b)
{
	HA a = num;
	if (a.len == b.len)
	{
		for (int i = a.len - 1; i >= 0; i--)
		{
			if (a.data[i] != b.data[i])
			{
				return a.data[i] < b.data[i];
			}
		}
		return 0;
	}
	else
	{
		return a.len < b.len;
	}
}

bool operator > (const HA& a, const HA& b)
{
	if (a.len == b.len)
	{
		for (int i = a.len - 1; i >= 0; i--)
		{
			if (a.data[i] != b.data[i])
			{
				return a.data[i] > b.data[i];
			}
		}
		return 0;
	}
	else
	{
		return a.len > b.len;
	}
}

bool operator > (const HA& a, long long num)
{
	HA b = num;
	if (a.len == b.len)
	{
		for (int i = a.len - 1; i >= 0; i--)
		{
			if (a.data[i] != b.data[i])
			{
				return a.data[i] > b.data[i];
			}
		}
		return 0;
	}
	else
	{
		return a.len > b.len;
	}
}

bool operator > (long long num, const HA& b)
{
	HA a = num;
	if (a.len == b.len)
	{
		for (int i = a.len - 1; i >= 0; i--)
		{
			if (a.data[i] != b.data[i])
			{
				return a.data[i] > b.data[i];
			}
		}
		return 0;
	}
	else
	{
		return a.len > b.len;
	}
}

ostream& operator << (ostream& out, const HA& ha)
{
	for (int i = ha.len - 1; i >= 0; i--)
	{
		out << ha.data[i];
	}
	return out;
}

istream& operator >> (istream& in, HA& ha)
{
	memset(ha.data, '0', sizeof(ha.data));
	ha.len = 0;
	char tmp[MAXN];
	in >> tmp;
	int len = strlen(tmp);
	for (int i = len - 1; i >= 0; i--)
	{
		ha.data[ha.len++] = tmp[i];
	}
	if (ha.len == 1 && ha.data[0] == '0')
	{
		ha.len = 1;
	}
	return in;
}

const HA& max(const HA& a, const HA& b)
{
	return a > b ? a : b;
}

const HA& max(long long num, const HA& b)
{
	const HA& a = num;
	return a > b ? a : b;
}

int main()
{
	HA a, b;
	while (1)
	{
		cin >> a >> b;
		cout << a + b << endl;
		cout << a * b << endl;
	}
	return 0;
}