ACMDay13大整数加减乘除

大整数加减乘除法还没搞定(本蒟蒻搞了一上午)233

/*
大整数加减乘除的参数均为正若需要用到负可在主函数中进行变换操作
*/


/*
大整数加减乘除的参数均为正若需要用到负可在主函数中进行变换操作
*/


#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string s1, s2, s3;
int file = 0;
int P;
void Plus(string s4, string s5)
{
	s3.clear();
	int up = 0;
	int a, b, c;
	int i;
	for (i = 1; i <= min(s4.size(), s5.size()); i++)
	{
		a = (int)(s4[s4.size() - i] - '0');
		b = (int)(s5[s5.size() - i] - '0');
		c = a + b + up;
		up = c / 10;
		c = c % 10;
		s3.insert(s3.begin(), (char)(c + '0'));
	}
	if (up != 0)
	{
		if (s4.size() < s5.size())
			for (i; i <= s5.size(); i++)
			{
				a = (int)(s5[s5.size() - i] - '0');
				if (a + up < 10)
				{
					s5[s5.size() - i] = (char)((a + up) % 10 + '0');
					break;
				}
				s5[s5.size() - i] = (char)((a + up) % 10 + '0');
				up = (a + up) / 10;
				if (i == s5.size())
				{
					s5.insert(s5.begin(), (char)(up + '0'));
					break;
				}
			}
		else if (s4.size() > s5.size())
		{
			for (i; i <= s4.size(); i++)
			{
				a = (int)(s4[s4.size() - i] - '0');
				if (a + up < 10)
				{
					s4[s4.size() - i] = (char)((a + up) % 10 + '0');
					break;
				}
				s4[s4.size() - i] = (char)((a + up) % 10 + '0');
				up = (a + up) / 10;
				if (i == s4.size())
				{
					s4.insert(s4.begin(), (char)(up + '0'));
					break;
				}
			}
		}
		else
		{
			s4.insert(s4.begin(), (char)(up + '0'));
		}
	}
	if (s4.size() >= s5.size())
	{
		s4.erase(s4.end() - s5.size(), s4.end());
		s4 = s4 + s3;
		s3 = s4;
	}
	if (s4.size() < s5.size())
	{
		s5.erase(s5.end() - s4.size(), s5.end());
		s5 = s5 + s3;
		s3 = s5;
	}
}

void Reduce(string s4, string s5)
{
	s3.clear();
	int a, b, c;
	int down = 0;
	if (s4.size() > s5.size())
	{
		for (int i = 1; i <= s5.size(); i++)
		{
			a = (int)(s4[s4.size() - i] - '0');
			b = (int)(s5[s5.size() - i] - '0');
			if (a < b)
			{
				if ((int)(s4[s4.size() - i - 1] - '0') > 0)
				{
					s4[s4.size() - i - 1] = (char)((int)(s4[s4.size() - i - 1] - '0') - 1 + '0');
					c = a + 10 - b;
					s3.insert(s3.begin(), (char)(c + '0'));
				}
				else
				{
					int j = s4.size() - i - 2;
					for (j; j >= 0; j--)
					{
						if ((int)(s4[j] - '0') > 0)
						{
							s4[j] = (char)((int)(s4[j] - '0') - 1 + '0');
							break;
						}
					}
					for (j = j + 1; j <= s4.size() - i - 1; j++)
						s4[j] = char(9 + '0');
					c = a + 10 - b;
					s3.insert(s3.begin(), (char)(c + '0'));
				}
			}
			else
			{
				c = a - b;
				s3.insert(s3.begin(), (char)(c + '0'));
			}
		}
		s4.erase(s4.end() - s5.size(), s4.end());
		s4 = s4 + s3;
		s3 = s4;
		string s6;
		for (int i = 0; i < s3.size(); i++)
			s6 = s6 + '0';
		if (s3.size() > 1 && s3 != s6)
		{
			int m;
			for (m = 0; m < s3.size(); m++)
			{
				if (s3[m] != '0')
					break;
			}
			if (m > 0)
				s3.erase(s3.begin() + 1, s3.begin() + m);
		}
		else if (s3[0] == '0')
			s3 = "0";
	}
	else if (s4.size() < s5.size())
	{
		for (int i = 1; i <= s4.size(); i++)
		{
			a = (int)(s5[s5.size() - i] - '0');
			b = (int)(s4[s4.size() - i] - '0');
			if (a < b)
			{
				if ((int)(s5[s5.size() - i - 1] - '0') > 0)
				{
					s5[s5.size() - i - 1] = (char)((int)(s5[s5.size() - i - 1] - '0') - 1 + '0');
					c = a + 10 - b;
					s3.insert(s3.begin(), (char)(c + '0'));
				}
				else
				{
					int j = s5.size() - i - 2;
					for (j; j >= 0; j--)
					{
						if ((int)(s5[j] - '0') > 0)
						{
							s5[j] = (char)((int)(s5[j] - '0') - 1 + '0');
							break;
						}
					}
					for (j = j + 1; j <= s5.size() - i - 1; j++)
						s5[j] = char(9 + '0');
					c = a + 10 - b;
					s3.insert(s3.begin(), (char)(c + '0'));
				}
			}
			else
			{
				c = a - b;
				s3.insert(s3.begin(), (char)(c + '0'));
			}
		}

		s5.erase(s5.end() - s4.size(), s5.end());
		s5 = s5 + s3;
		s3 = s5;
		s3.insert(s3.begin(), '-');
		string s6;
		for (int i = 0; i < s3.size() - 1; i++)
			s6 = s6 + '0';
		s6.insert(s6.begin(), '-');
		if (s3.size() > 2 && s3 != s6)
		{
			int m;
			for (m = 1; m < s3.size(); m++)
			{
				if (s3[m] != '0')
					break;
			}
			if (m > 1)
				s3.erase(s3.begin() + 1, s3.begin() + m);
		}
		else if (s3[1] == '0')
			s3 = "0";
	}
	else if (s4.size() == s5.size())
	{
		if (s4 > s5)
		{
			for (int i = 1; i <= s5.size(); i++)
			{
				a = (int)(s4[s4.size() - i] - '0');
				b = (int)(s5[s5.size() - i] - '0');
				if (a < b)
				{
					if ((int)(s4[s4.size() - i - 1] - '0') > 0)
					{
						s4[s4.size() - i - 1] = (char)((int)(s4[s4.size() - i - 1] - '0') - 1 + '0');
						c = a + 10 - b;
						s3.insert(s3.begin(), (char)(c + '0'));
					}
					else
					{
						int j = s4.size() - i - 2;
						for (j; j >= 0; j--)
						{
							if ((int)(s4[j] - '0') > 0)
							{
								s4[j] = (char)((int)(s4[j] - '0') - 1 + '0');
								break;
							}
						}
						for (j = j + 1; j <= s4.size() - i - 1; j++)
							s4[j] = char(9 + '0');
						c = a + 10 - b;
						s3.insert(s3.begin(), (char)(c + '0'));
					}
				}
				else
				{
					c = a - b;
					s3.insert(s3.begin(), (char)(c + '0'));
				}
			}
			string s6;
			for (int i = 0; i < s3.size(); i++)
				s6 = s6 + '0';
			if (s3.size() > 1 && s3 != s6)
			{
				int m;
				for (m = 0; m < s3.size(); m++)
				{
					if (s3[m] != '0')
						break;
				}
				if (m > 0)
					s3.erase(s3.begin() + 1, s3.begin() + m);
			}
			else if (s3[0] == '0')
				s3 = "0";
		}
		if (s4 < s5)
		{
			for (int i = 1; i <= s4.size(); i++)
			{
				a = (int)(s5[s5.size() - i] - '0');
				b = (int)(s4[s4.size() - i] - '0');
				if (a < b)
				{
					if ((int)(s5[s5.size() - i - 1] - '0') > 0)
					{
						s5[s5.size() - i - 1] = (char)((int)(s5[s5.size() - i - 1] - '0') - 1 + '0');
						c = a + 10 - b;
						s3.insert(s3.begin(), (char)(c + '0'));
					}
					else
					{
						int j = s5.size() - i - 2;
						for (j; j >= 0; j--)
						{
							if ((int)(s5[j] - '0') > 0)
							{
								s5[j] = (char)((int)(s5[j] - '0') - 1 + '0');
								break;
							}
						}
						for (j = j + 1; j <= s5.size() - i - 1; j++)
							s5[j] = char(9 + '0');
						c = a + 10 - b;
						s3.insert(s3.begin(), (char)(c + '0'));
					}
				}
				else
				{
					c = a - b;
					s3.insert(s3.begin(), (char)(c + '0'));
				}
			}
			s3.insert(s3.begin(), '-');
			string s6;
			for (int i = 0; i < s3.size() - 1; i++)
				s6 = s6 + '0';
			s6.insert(s6.begin(), '-');
			if (s3.size() > 2 && s3 != s6)
			{
				int m;
				for (m = 1; m < s3.size(); m++)
				{
					if (s3[m] != '0')
						break;
				}
				if (m > 1)
					s3.erase(s3.begin() + 1, s3.begin() + m);
			}
			else if (s3[1] == '0')
				s3 = "0";
		}
		else
			s3 = "0";
	}
}

void Multiplication(string s4, string s5)
{
	if (s4[0] == '-')
	{
		s1.erase(s1.begin(), s1.begin() + 1);
		file++;
	}
	if (s5[0] == '-')
	{
		s2.erase(s2.begin(), s2.begin() + 1);
		file++;
	}
	s3.clear();
	int a, b, c, d;
	int up = 0;
	s3 = "0";
	if (s4[0] == '0' || s5[0] == '0')
		return;
	string s6;
	if (s4.size() >= s5.size())
	{
		for (int i = 1; i <= s5.size(); i++)
		{
			a = (int)(s5[s5.size() - i] - '0');
			for (int j = 1; j <= s4.size(); j++)
			{
				b = (int)(s4[s4.size() - j] - '0');
				c = a * b + up;
				s6.insert(s6.begin(), (char)(c % 10 + '0'));
				up = c / 10;
			}
			if (up != 0) {
				s6.insert(s6.begin(), (char)(up + '0'));
				up = 0;
			}
			for (int j = i - 1; j > 0; j--)
			{
				s6 = s6 + '0';
			}
			Plus(s3, s6);
			s6.clear();
		}
	}
	if (s4.size() < s5.size())
	{
		for (int i = 1; i <= s4.size(); i++)
		{
			a = (int)(s4[s4.size() - i] - '0');
			for (int j = 1; j <= s5.size(); j++)
			{
				b = (int)(s5[s5.size() - j] - '0');
				c = a * b + up;
				s6.insert(s6.begin(), (char)(c % 10 + '0'));
				up = c / 10;
			}
			if (up != 0) {
				s6.insert(s6.begin(), (char)(up + '0'));
				up = 0;
			}
			for (int j = i - 1; j > 0; j--)
			{
				s6 = s6 + '0';
			}
			Plus(s3, s6);
			s6.clear();
		}
	}
	if (file == 1)
		s3.insert(s3.begin(), '-');
}

next_permutation()就是一个求一个排序的下一个排列的函数,可以遍历全排列

与之完全相反的函数还有prev_permutation(就是一个求一个排序的上一个排列的函数)
(本蒟蒻今天写火星人这道题一直以为是进制后来看到这个之后才发现是全排列)

ios::sync_with_stdio(false);关闭缓冲流能大大节省时间

改进版减法:

void Now_Reduce(string s4, string s5)
{
	s3.clear();
	int a, b, c;
	int down = 0;
	if (s4.size() > s5.size())//大于零的情况
	{
		for (int i = 1; i <= s5.size(); i++)
		{
			a = (int)(s4[s4.size() - i] - '0');
			b = (int)(s5[s5.size() - i] - '0');
			if (a > b)
			{
				c = a - b+down;
				s3.insert(s3.begin(), (char)(c + '0'));
				down = 0;
			}
			else if (a == b)
			{
				if (down < 0)
				{
					c = 9;
					s3.insert(s3.begin(), (char)(c + '0'));
					down = -1;
				}
				else
				{
					s3.insert(s3.begin(), '0');
				}
			}
			else if (a < b)
			{
				c = a - b + 10 + down;
				s3.insert(s3.begin(), (char)(c + '0'));
				down = -1;
			}
		}
		if (down != 0)
		{
			for (int i = s4.size() - s5.size()-1; i >= 0; i--)
			{
				if (s4[i] > '0')
				{
					s4[i] = (char)(s4[i] - 1);
					down = 0;
					break;
				}
				else
				{
					s4[i] = '9';
				}
			}
		}
		s4.erase(s4.end() - s5.size(), s4.end());
		s4 = s4 + s3;
		s3 = s4;
		int m;
		for (m = 0; m < s3.size(); m++)
		{
			if (s3[m] != '0')
				break;
		}
		if (m > 0)
			s3.erase(s3.begin(), s3.begin() + m);
	}
	if (s4.size() < s5.size())
	{
		for (int i = 1; i <= s4.size(); i++)
		{
			a = (int)(s5[s5.size() - i] - '0');
			b = (int)(s4[s4.size() - i] - '0');
			if (a > b)
			{
				c = a - b + down;
				s3.insert(s3.begin(), (char)(c + '0'));
				down = 0;
			}
			else if (a == b)
			{
				if (down < 0)
				{
					c = 9;
					s3.insert(s3.begin(), (char)(c + '0'));
					down = -1;
				}
				else
				{
					s3.insert(s3.begin(), '0');
				}
			}
			else if (a < b)
			{
				c = a - b + 10 + down;
				s3.insert(s3.begin(), (char)(c + '0'));
				down = -1;
			}
		}
		if (down != 0)
		{
			for (int i = s5.size() - s4.size() - 1; i >= 0; i--)
			{
				if (s5[i] > '0')
				{
					s5[i] = (char)(s5[i] - 1);
					down = 0;
					break;
				}
				else
				{
					s5[i] = '9';
				}
			}
		}
		s5.erase(s5.end() - s4.size(), s5.end());
		s5 = s5 + s3;
		s3 = s5;
		int m;
		for (m = 0; m < s3.size(); m++)
		{
			if (s3[m] != '0')
				break;
		}
		if (m > 0)
			s3.erase(s3.begin(), s3.begin() + m);
		s3.insert(s3.begin(), '-');
	}
	if (s4.size() == s5.size())
	{
		if (s4 > s5)
		{
			for (int i = 1; i <= s5.size(); i++)
			{
				a = (int)(s4[s4.size() - i] - '0');
				b = (int)(s5[s5.size() - i] - '0');
				if (a > b)
				{
					c = a - b + down;
					s3.insert(s3.begin(), (char)(c + '0'));
					down = 0;
				}
				else if (a == b)
				{
					if (down < 0)
					{
						c = 9;
						s3.insert(s3.begin(), (char)(c + '0'));
						down = -1;
					}
					else
					{
						s3.insert(s3.begin(), '0');
					}
				}
				else if (a < b)
				{
					c = a - b + 10 + down;
					s3.insert(s3.begin(), (char)(c + '0'));
					down = -1;
				}
			}
			int m;
			for (m = 0; m < s3.size(); m++)
			{
				if (s3[m] != '0')
					break;
			}
			if (m > 0)
				s3.erase(s3.begin(), s3.begin() + m);
		}
		if (s4 == s5)
			s3 = "0";
		if (s4 < s5)
		{
			for (int i = 1; i <= s4.size(); i++)
			{
				a = (int)(s5[s5.size() - i] - '0');
				b = (int)(s4[s4.size() - i] - '0');
				if (a > b)
				{
					c = a - b + down;
					s3.insert(s3.begin(), (char)(c + '0'));
					down = 0;
				}
				else if (a == b)
				{
					if (down < 0)
					{
						c = 9;
						s3.insert(s3.begin(), (char)(c + '0'));
						down = -1;
					}
					else
					{
						s3.insert(s3.begin(), '0');
					}
				}
				else if (a < b)
				{
					c = a - b + 10 + down;
					s3.insert(s3.begin(), (char)(c + '0'));
					down = -1;
				}
			}
			int m;
			for (m = 0; m < s3.size(); m++)
			{
				if (s3[m] != '0')
					break;
			}
			if (m > 0)
				s3.erase(s3.begin(), s3.begin() + m);
			s3.insert(s3.begin(), '-');
		}
	}
}

完整的大整数加减乘除:

/*
大整数加减乘除的参数均为正若需要用到负可在主函数中进行变换操作
*/


#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string s1, s2, s3;
int file = 0;

void Plus(string s4, string s5)
{
	s3.clear();
	int up = 0;
	int a, b, c;
	int i;
	for (i = 1; i <= min(s4.size(), s5.size()); i++)
	{
		a = (int)(s4[s4.size() - i] - '0');
		b = (int)(s5[s5.size() - i] - '0');
		c = a + b + up;
		up = c / 10;
		c = c % 10;
		s3.insert(s3.begin(), (char)(c + '0'));
	}
	if (up != 0)
	{
		if (s4.size() < s5.size())
			for (i; i <= s5.size(); i++)
			{
				a = (int)(s5[s5.size() - i] - '0');
				if (a + up < 10)
				{
					s5[s5.size() - i] = (char)((a + up) % 10 + '0');
					break;
				}
				s5[s5.size() - i] = (char)((a + up) % 10 + '0');
				up = (a + up) / 10;
				if (i == s5.size())
				{
					s5.insert(s5.begin(), (char)(up + '0'));
					break;
				}
			}
		else if (s4.size() > s5.size())
		{
			for (i; i <= s4.size(); i++)
			{
				a = (int)(s4[s4.size() - i] - '0');
				if (a + up < 10)
				{
					s4[s4.size() - i] = (char)((a + up) % 10 + '0');
					break;
				}
				s4[s4.size() - i] = (char)((a + up) % 10 + '0');
				up = (a + up) / 10;
				if (i == s4.size())
				{
					s4.insert(s4.begin(), (char)(up + '0'));
					break;
				}
			}
		}
		else
		{
			s4.insert(s4.begin(), (char)(up + '0'));
		}
	}
	if (s4.size() >= s5.size())
	{
		s4.erase(s4.end() - s5.size(), s4.end());
		s4 = s4 + s3;
		s3 = s4;
	}
	if (s4.size() < s5.size())
	{
		s5.erase(s5.end() - s4.size(), s5.end());
		s5 = s5 + s3;
		s3 = s5;
	}
}

void Reduce(string s4, string s5)
{
	s3.clear();
	int a, b, c;
	int down = 0;
	if (s4.size() > s5.size())
	{
		for (int i = 1; i <= s5.size(); i++)
		{
			a = (int)(s4[s4.size() - i] - '0');
			b = (int)(s5[s5.size() - i] - '0');
			if (a < b)
			{
				if ((int)(s4[s4.size() - i - 1] - '0') > 0)
				{
					s4[s4.size() - i - 1] = (char)((int)(s4[s4.size() - i - 1] - '0') - 1 + '0');
					c = a + 10 - b;
					s3.insert(s3.begin(), (char)(c + '0'));
				}
				else
				{
					int j = s4.size() - i - 2;
					for (j; j >= 0; j--)
					{
						if ((int)(s4[j] - '0') > 0)
						{
							s4[j] = (char)((int)(s4[j] - '0') - 1 + '0');
							break;
						}
					}
					for (j = j + 1; j <= s4.size() - i - 1; j++)
						s4[j] = char(9 + '0');
					c = a + 10 - b;
					s3.insert(s3.begin(), (char)(c + '0'));
				}
			}
			else
			{
				c = a - b;
				s3.insert(s3.begin(), (char)(c + '0'));
			}
		}
		s4.erase(s4.end() - s5.size(), s4.end());
		s4 = s4 + s3;
		s3 = s4;
		string s6;
		for (int i = 0; i < s3.size(); i++)
			s6 = s6 + '0';
		if (s3.size() > 1 && s3 != s6)
		{
			int m;
			for (m = 1; m < s3.size(); m++)
			{
				if (s3[m] != '0')
					break;
			}
			if (m > 1)
				s3.erase(s3.begin() + 1, s3.begin() + m);
		}
		else if (s3[0] == '0')
			s3 = "0";
	}
	else if (s4.size() < s5.size())
	{
		for (int i = 1; i <= s4.size(); i++)
		{
			a = (int)(s5[s5.size() - i] - '0');
			b = (int)(s4[s4.size() - i] - '0');
			if (a < b)
			{
				if ((int)(s5[s5.size() - i - 1] - '0') > 0)
				{
					s5[s5.size() - i - 1] = (char)((int)(s5[s5.size() - i - 1] - '0') - 1 + '0');
					c = a + 10 - b;
					s3.insert(s3.begin(), (char)(c + '0'));
				}
				else
				{
					int j = s5.size() - i - 2;
					for (j; j >= 0; j--)
					{
						if ((int)(s5[j] - '0') > 0)
						{
							s5[j] = (char)((int)(s5[j] - '0') - 1 + '0');
							break;
						}
					}
					for (j = j + 1; j <= s5.size() - i - 1; j++)
						s5[j] = char(9 + '0');
					c = a + 10 - b;
					s3.insert(s3.begin(), (char)(c + '0'));
				}
			}
			else
			{
				c = a - b;
				s3.insert(s3.begin(), (char)(c + '0'));
			}
		}

		s5.erase(s5.end() - s4.size(), s5.end());
		s5 = s5 + s3;
		s3 = s5;
		s3.insert(s3.begin(), '-');
		string s6;
		for (int i = 0; i < s3.size() - 1; i++)
			s6 = s6 + '0';
		s6.insert(s6.begin(), '-');
		if (s3.size() > 2 && s3 != s6)
		{
			int m;
			for (m = 1; m < s3.size(); m++)
			{
				if (s3[m] != '0')
					break;
			}
			if (m > 1)
				s3.erase(s3.begin() + 1, s3.begin() + m);
		}
		else if (s3[1] == '0')
			s3 = "0";
	}
	else if (s4.size() == s5.size())
	{
		if (s4 > s5)
		{
			for (int i = 1; i <= s5.size(); i++)
			{
				a = (int)(s4[s4.size() - i] - '0');
				b = (int)(s5[s5.size() - i] - '0');
				if (a < b)
				{
					if ((int)(s4[s4.size() - i - 1] - '0') > 0)
					{
						s4[s4.size() - i - 1] = (char)((int)(s4[s4.size() - i - 1] - '0') - 1 + '0');
						c = a + 10 - b;
						s3.insert(s3.begin(), (char)(c + '0'));
					}
					else
					{
						int j = s4.size() - i - 2;
						for (j; j >= 0; j--)
						{
							if ((int)(s4[j] - '0') > 0)
							{
								s4[j] = (char)((int)(s4[j] - '0') - 1 + '0');
								break;
							}
						}
						for (j = j + 1; j <= s4.size() - i - 1; j++)
							s4[j] = char(9 + '0');
						c = a + 10 - b;
						s3.insert(s3.begin(), (char)(c + '0'));
					}
				}
				else
				{
					c = a - b;
					s3.insert(s3.begin(), (char)(c + '0'));
				}
			}
			string s6;
			for (int i = 0; i < s3.size(); i++)
				s6 = s6 + '0';
			if (s3.size() > 1 && s3 != s6)
			{
				int m;
				for (m = 1; m < s3.size(); m++)
				{
					if (s3[m] != '0')
						break;
				}
				if (m > 1)
					s3.erase(s3.begin() + 1, s3.begin() + m);
			}
			else if (s3[0] == '0')
				s3 = "0";
		}
		if (s4 < s5)
		{
			for (int i = 1; i <= s4.size(); i++)
			{
				a = (int)(s5[s5.size() - i] - '0');
				b = (int)(s4[s4.size() - i] - '0');
				if (a < b)
				{
					if ((int)(s5[s5.size() - i - 1] - '0') > 0)
					{
						s5[s5.size() - i - 1] = (char)((int)(s5[s5.size() - i - 1] - '0') - 1 + '0');
						c = a + 10 - b;
						s3.insert(s3.begin(), (char)(c + '0'));
					}
					else
					{
						int j = s5.size() - i - 2;
						for (j; j >= 0; j--)
						{
							if ((int)(s5[j] - '0') > 0)
							{
								s5[j] = (char)((int)(s5[j] - '0') - 1 + '0');
								break;
							}
						}
						for (j = j + 1; j <= s5.size() - i - 1; j++)
							s5[j] = char(9 + '0');
						c = a + 10 - b;
						s3.insert(s3.begin(), (char)(c + '0'));
					}
				}
				else
				{
					c = a - b;
					s3.insert(s3.begin(), (char)(c + '0'));
				}
			}
			s3.insert(s3.begin(), '-');
			string s6;
			for (int i = 0; i < s3.size() - 1; i++)
				s6 = s6 + '0';
			s6.insert(s6.begin(), '-');
			if (s3.size() > 2 && s3 != s6)
			{
				int m;
				for (m = 1; m < s3.size(); m++)
				{
					if (s3[m] != '0')
						break;
				}
				if (m > 1)
					s3.erase(s3.begin() + 1, s3.begin() + m);
			}
			else if (s3[1] == '0')
				s3 = "0";
		}
		else
			s3 = "0";
	}
}

void Now_Reduce(string s4, string s5)
{
	s3.clear();
	int a, b, c;
	int down = 0;
	if (s4.size() > s5.size())//大于零的情况
	{
		for (int i = 1; i <= s5.size(); i++)
		{
			a = (int)(s4[s4.size() - i] - '0');
			b = (int)(s5[s5.size() - i] - '0');
			if (a > b)
			{
				c = a - b + down;
				s3.insert(s3.begin(), (char)(c + '0'));
				down = 0;
			}
			else if (a == b)
			{
				if (down < 0)
				{
					c = 9;
					s3.insert(s3.begin(), (char)(c + '0'));
					down = -1;
				}
				else
				{
					s3.insert(s3.begin(), '0');
				}
			}
			else if (a < b)
			{
				c = a - b + 10 + down;
				s3.insert(s3.begin(), (char)(c + '0'));
				down = -1;
			}
		}
		if (down != 0)
		{
			for (int i = s4.size() - s5.size() - 1; i >= 0; i--)
			{
				if (s4[i] > '0')
				{
					s4[i] = (char)(s4[i] - 1);
					down = 0;
					break;
				}
				else
				{
					s4[i] = '9';
				}
			}
		}
		s4.erase(s4.end() - s5.size(), s4.end());
		s4 = s4 + s3;
		s3 = s4;
		int m;
		for (m = 0; m < s3.size(); m++)
		{
			if (s3[m] != '0')
				break;
		}
		if (m > 0)
			s3.erase(s3.begin(), s3.begin() + m);
	}
	if (s4.size() < s5.size())
	{
		for (int i = 1; i <= s4.size(); i++)
		{
			a = (int)(s5[s5.size() - i] - '0');
			b = (int)(s4[s4.size() - i] - '0');
			if (a > b)
			{
				c = a - b + down;
				s3.insert(s3.begin(), (char)(c + '0'));
				down = 0;
			}
			else if (a == b)
			{
				if (down < 0)
				{
					c = 9;
					s3.insert(s3.begin(), (char)(c + '0'));
					down = -1;
				}
				else
				{
					s3.insert(s3.begin(), '0');
				}
			}
			else if (a < b)
			{
				c = a - b + 10 + down;
				s3.insert(s3.begin(), (char)(c + '0'));
				down = -1;
			}
		}
		if (down != 0)
		{
			for (int i = s5.size() - s4.size() - 1; i >= 0; i--)
			{
				if (s5[i] > '0')
				{
					s5[i] = (char)(s5[i] - 1);
					down = 0;
					break;
				}
				else
				{
					s5[i] = '9';
				}
			}
		}
		s5.erase(s5.end() - s4.size(), s5.end());
		s5 = s5 + s3;
		s3 = s5;
		int m;
		for (m = 0; m < s3.size(); m++)
		{
			if (s3[m] != '0')
				break;
		}
		if (m > 0)
			s3.erase(s3.begin(), s3.begin() + m);
		s3.insert(s3.begin(), '-');
	}
	if (s4.size() == s5.size())
	{
		if (s4 > s5)
		{
			for (int i = 1; i <= s5.size(); i++)
			{
				a = (int)(s4[s4.size() - i] - '0');
				b = (int)(s5[s5.size() - i] - '0');
				if (a > b)
				{
					c = a - b + down;
					s3.insert(s3.begin(), (char)(c + '0'));
					down = 0;
				}
				else if (a == b)
				{
					if (down < 0)
					{
						c = 9;
						s3.insert(s3.begin(), (char)(c + '0'));
						down = -1;
					}
					else
					{
						s3.insert(s3.begin(), '0');
					}
				}
				else if (a < b)
				{
					c = a - b + 10 + down;
					s3.insert(s3.begin(), (char)(c + '0'));
					down = -1;
				}
			}
			int m;
			for (m = 0; m < s3.size(); m++)
			{
				if (s3[m] != '0')
					break;
			}
			if (m > 0)
				s3.erase(s3.begin(), s3.begin() + m);
		}
		if (s4 == s5)
			s3 = "0";
		if (s4 < s5)
		{
			for (int i = 1; i <= s4.size(); i++)
			{
				a = (int)(s5[s5.size() - i] - '0');
				b = (int)(s4[s4.size() - i] - '0');
				if (a > b)
				{
					c = a - b + down;
					s3.insert(s3.begin(), (char)(c + '0'));
					down = 0;
				}
				else if (a == b)
				{
					if (down < 0)
					{
						c = 9;
						s3.insert(s3.begin(), (char)(c + '0'));
						down = -1;
					}
					else
					{
						s3.insert(s3.begin(), '0');
					}
				}
				else if (a < b)
				{
					c = a - b + 10 + down;
					s3.insert(s3.begin(), (char)(c + '0'));
					down = -1;
				}
			}
			int m;
			for (m = 0; m < s3.size(); m++)
			{
				if (s3[m] != '0')
					break;
			}
			if (m > 0)
				s3.erase(s3.begin(), s3.begin() + m);
			s3.insert(s3.begin(), '-');
		}
	}
}
void Multiplication(string s4, string s5)
{
	if (s4[0] == '-')
	{
		s1.erase(s1.begin(), s1.begin() + 1);
		file++;
	}
	if (s5[0] == '-')
	{
		s2.erase(s2.begin(), s2.begin() + 1);
		file++;
	}
	s3.clear();
	int a, b, c, d;
	int up = 0;
	s3 = "0";
	if (s4[0] == '0' || s5[0] == '0')
		return;
	string s6;
	if (s4.size() >= s5.size())
	{
		for (int i = 1; i <= s5.size(); i++)
		{
			a = (int)(s5[s5.size() - i] - '0');
			for (int j = 1; j <= s4.size(); j++)
			{
				b = (int)(s4[s4.size() - j] - '0');
				c = a * b + up;
				s6.insert(s6.begin(), (char)(c % 10 + '0'));
				up = c / 10;
			}
			if (up != 0) {
				s6.insert(s6.begin(), (char)(up + '0'));
				up = 0;
			}
			for (int j = i - 1; j > 0; j--)
			{
				s6 = s6 + '0';
			}
			Plus(s3, s6);
			s6.clear();
		}
	}
	if (s4.size() < s5.size())
	{
		for (int i = 1; i <= s4.size(); i++)
		{
			a = (int)(s4[s4.size() - i] - '0');
			for (int j = 1; j <= s5.size(); j++)
			{
				b = (int)(s5[s5.size() - j] - '0');
				c = a * b + up;
				s6.insert(s6.begin(), (char)(c % 10 + '0'));
				up = c / 10;
			}
			if (up != 0) {
				s6.insert(s6.begin(), (char)(up + '0'));
				up = 0;
			}
			for (int j = i - 1; j > 0; j--)
			{
				s6 = s6 + '0';
			}
			Plus(s3, s6);
			s6.clear();
		}
	}
	if (file == 1)
		s3.insert(s3.begin(), '-');
}
void Division(string s4, string s5)
{
	int lg;
	s3.clear();
	if (s4.size() < s5.size())
	{
		s3 = "0";
		return;
	}
	if (s4.size() == s5.size())
	{
		string q;
		int i;
		for (i = 1;; i++)
		{
			q = i + '0';
			Multiplication(s5, q);
			if (s3.size() > s4.size())
				break;
			else if (s3 > s4&&s3.size() == s4.size())
				break;
		}
		s3.clear();
		s3 = i - 1 + '0';
		return;
	}
	if (s4.size() > s5.size())
	{
		long long r = s4.size();
		string w;
		while (s4.size() >= s5.size())
		{
			string s7;
			for (int i = 0; i < s4.size(); i++)
				s7 = s7 + '0';
			if (s7 == s4)
				break;
			if (s4[0] == '0')
			{
				w = w + '0';
				s4.erase(s4.begin(), s4.begin() + 1);
				continue;
			}
			string s6(s4, 0, s5.size());
			if (s6 >= s5)
			{
				if (w.size() > 0)
				{
					for (int j = 0; j < lg-2; j++)
						w = w + '0';
				}
				int i = 0;
				string q;
				for (i = 1;; i++)
				{
					q = i + '0';
					Multiplication(s5, q);
					if (s3.size() > s6.size())
						break;
					else if (s3 > s6&&s3.size() == s6.size())
						break;
				}
				w = w + (char)(i - 1 + '0');
				Now_Reduce(s3, s5);
				Now_Reduce(s6, s3);
				if (s3 != "0")
					s4.replace(s4.begin(), s4.begin() + s5.size(), s3);
				else
					s4.erase(s4.begin(), s4.begin() + s5.size());
				lg = s5.size() - s3.size();
			}
			else if (s4.size() >= s5.size() + 1)
			{
				if (w.size() > 0)
				{
					for (int j = 0; j < lg-1; j++)
						w = w + '0';
				}
				string s6(s4, 0, s5.size() + 1);
				int i = 0;
				string q;
				for (i = 1;; i++)
				{
					q = i + '0';
					Multiplication(s5, q);
					if (s3.size() > s6.size())
						break;
					else if (s3 > s6&&s3.size() == s6.size())
						break;
				}
				w = w + (char)(i - 1 + '0');
				Now_Reduce(s3, s5);
				Now_Reduce(s6, s3);
				if (s3 != "0")
					s4.replace(s4.begin(), s4.begin() + s5.size(), s3);
				else
					s4.erase(s4.begin(), s4.begin() + s5.size() + 1);
				lg = s5.size() - s3.size();
			}
			else
				break;
		}
		if (s4.size() > 0)
		{
			for (int j = 0; j < s4.size(); j++)
				w = w + '0';
			s3 = w;
			return;
		}
		else
		{
			s3 = w;
			return;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值