#10 TLE
查看原帖
#10 TLE
226686
Herobrine6265楼主2023/9/30 12:28

rt

实在是不知道怎么优化了.jpg

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct Bigint
{
	string s;
	Bigint(string a)
	{
		this->s = a;
	}
	bool operator<(Bigint q)
	{
		string a = this->s, b = q.s;
		if (a[0] == '-' || b[0] == '-')
		{
			if (a[0] == '-' && b[0] == '-')
			{
				a.erase(0, 1);
				b.erase(0, 1);
				if (a.length() < b.length())
					return 0;
				if (a.length() > b.length())
					return 1;
				return (a > b) ? 1 : 0;
			}
			else if (a[0] == '-')
				return 1;
			else if (b[0] == '-')
				return 0;
		}
		if (a.length() < b.length())
			return 1;
		if (a.length() > b.length())
			return 0;
		return (a < b) ? 1 : 0;
	}
	bool operator<=(Bigint q)
	{
		if ((*this) < q)
			return 1;
		if ((this->s) == q.s)
			return 1;
		return 0;
	}
	Bigint operator+(Bigint q)
	{
		string a = this->s, b = q.s;
		long long len1 = a.length(), len2 = b.length();
		bool min = 0;
		if (a[0] == '-' || b[0] == '-')
		{
			if ((a[0] == '-') && (b[0] == '-'))
			{
				a.erase(0, 1);
				b.erase(0, 1);
				len1--;
				len2--;
				min = 1;
			}
			else if (a[0] == '-')
			{
				this->s.erase(0, 1);
				return q - (*this);
			}
			else
			{
				q.s.erase(0, 1);
				return (*this) - q;
			}
		}
		if (len1 < len2)
		{
			while (len1 != len2)
			{
				a = "0" + a;
				len1++;
			}
		}
		else if (len1 > len2)
		{
			while (len1 != len2)
			{
				b = "0" + b;
				len2++;
			}
		}
		int c[len1 + 5];
		memset(c, 0, sizeof(c));
		for (long long i = len1 - 1; i >= 1; i--)
		{
			c[i] += int(a[i] + b[i] - int(2 * '0'));
			c[i - 1] += c[i] / 10;
			c[i] %= 10;
		}
		string ans;
		c[0] += int(a[0] + b[0] - int(2 * '0'));
		if (c[0] / 10)
		{
			ans = char(c[0] / 10 + '0');
			c[0] %= 10;
		}
		for (long long i = 0; i < len1; i++)
			ans = ans + char(c[i] + '0');
		if (min)
			ans = '-' + ans;
		return Bigint(ans);
	}
	Bigint operator-(Bigint q)
	{
		string a = this->s, b = q.s, ans = "";
		bool min = 0, zero = 1;
		if (a[0] == '-' || b[0] == '-')
		{
			if (a[0] == '-' && b[0] == '-')
			{
				a.erase(0, 1);
				b.erase(0, 1);
				min = 1;
			}
			else if (a[0] == '-')
			{
				this->s.erase(0, 1);
				return ("-" + ((*this) + q).s);
			}
			else if (b[0] == '-')
			{
				q.s.erase(0, 1);
				return (*this) + q;
			}
		}
		long long len1 = a.length(), len2 = b.length();
		if (len1 < len2)
		{
			while (len1 != len2)
			{
				a = "0" + a;
				len1++;
			}
		}
		else if (len1 > len2)
		{
			while (len1 != len2)
			{
				b = "0" + b;
				len2++;
			}
		}
		if (a < b)
		{
			min = !min;
			swap(a, b);
		}
		int c[len1 + 5];
		memset(c, 0, sizeof(c));
		for (long long i = len1 - 1; i > 0; i--)
		{
			c[i] += a[i] - b[i];
			if (c[i] < 0)
			{
				c[i] += 10;
				c[i - 1]--;
			}
		}
		c[0] += a[0] - b[0];
		for (long long i = 0; i < len1; i++)
		{
			if (c[i] == 0 && zero)
				continue;
			zero = 0;
			ans = ans + char(c[i] + '0');
		}
		if (ans == "")
			ans = "0";
		if (min)
			ans = "-" + ans;
		return Bigint(ans);
	}
	Bigint operator*(Bigint q)
	{
		string a = this->s, b = q.s, ans = "";
		bool min = 0;
		if (a[0] == '-' && b[0] == '-')
		{
			a.erase(0, 1);
			b.erase(0, 1);
		}
		else if (a[0] == '-')
		{
			min = 1;
			a.erase(0, 1);
		}
		else if (b[0] == '-')
		{
			min = 1;
			b.erase(0, 1);
		}
		long long len1 = a.length(), len2 = b.length();
		int c[len1 + len2 + 5];
		memset(c, 0, sizeof(c));
		a = "0" + a;
		b = "0" + b;
		for (long long i = len1; i > 0; i--)
		{
			for (long long j = len2; j > 0; j--)
			{
				c[len1 + len2 - i - j + 1] += (a[i] - '0') * (b[j] - '0');
				c[len1 + len2 - i - j + 2] += c[len1 + len2 - i - j + 1] / 10;
				c[len1 + len2 - i - j + 1] %= 10;
			}
		}
		for (long long i = 1; i < len1 + len2; i++)
			ans = char(c[i] + '0') + ans;
		if (c[len1 + len2])
			ans = char(c[len1 + len2] + '0') + ans;
		if (min)
			ans = "-" + ans;
		return Bigint(ans);
	}
	Bigint operator/(Bigint q)
	{
		string a = this->s, b = q.s;
		if ((*this) < q)
			return Bigint("0");
		if (b == "0")
			return Bigint("Error");
		unsigned long long len1 = a.length(), len2 = b.length(), sum = 0;
		string ans = "", use = a.substr(0, len2);
		a.erase(0, len2);
		if (use < b)
		{
			use = use + a.substr(0, 1);
			a.erase(0, 1);
		}
		while (q <= Bigint(use))
		{
			sum++;
			use = (Bigint(use) - q).s;
		}
		ans = char(sum + '0');
		while (1)
		{
			if (a == "")
				return Bigint(ans);
			sum = 0;
			use = use + a.substr(0, 1);
			a.erase(0, 1);
			while (q <= Bigint(use))
			{
				sum++;
				use = (Bigint(use) - q).s;
			}
			ans = ans + char(sum + '0');
		}
	}
	Bigint operator%(Bigint q)
	{
		string a = this->s, b = q.s;
		if ((*this) < q)
			return *this;
		if (b == "0")
			return Bigint("Error");
		long long len1 = a.length(), len2 = b.length(), sum = 0;
		string ans = "", use = a.substr(0, len2);
		a.erase(0, len2);
		if (use < b)
		{
			use = use + a.substr(0, 1);
			a.erase(0, 1);
		}
		while (q <= Bigint(use))
		{
			sum++;
			use = (Bigint(use) - q).s;
		}
		ans = char(sum + '0');
		while (1)
		{
			if (a == "")
				return Bigint(use);
			sum = 0;
			use = use + a.substr(0, 1);
			a.erase(0, 1);
			while (q <= Bigint(use))
			{
				sum++;
				use = (Bigint(use) - q).s;
			}
			ans = ans + char(sum + '0');
		}
	}
};
int main()
{
	freopen("P1932_10.in","r",stdin);
	freopen("666.out","w",stdout);
	std::ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	Bigint a("0"), b("0"), d("0");
	cin >> a.s >> b.s;
	cout << (a + b).s << endl
		 << (a - b).s << endl
		 << (a * b).s << endl
		 << (a / b).s << endl
		 << (a % b).s;
	return 0;
}
2023/9/30 12:28
加载中...