算法第七节(第2部分:大数的四则远算)

#include<iostream>
#include <string>
using namespace std;
class Mutiply
{
public:
	string mutiply(string num1 , string num2)
	{
		long len1 = num1.size();
		long len2 = num2.size();
		long * a = new long[len1];
		long * b = new long[len2];
		int len =len1 + len2; 
		long * result = new long[len];
		//先计算
		for (long i = 0; i < len1 ; i++)
		{
			a[i] = num1[i] - '0';
		}
		for (long j = 0; j < len2 ; j++)
		{
			b[j] = num2[j] - '0';
		}
		for (long i = 0 ; i < len ; i++)
		{
			result[i] = 0;
		} 
		// i = len1 + len2 -2
		for(long i = 0; i < len1 ; i++ )
		{
			for (long j = 0 ; j < len2; j++)
			{
				result[i + j] += a[i] * b[j];
				//	cout << result[i + j] << endl;
			}
		}

		//处理进位
		for (long i =len -2;  i > 0; i--)
		{
			
			{
				result[i - 1] += result[i]/10;
				result[i] = result[i] % 10;//当前位置的值
			}
		}
		string resultstr;
		resultstr = "";
		int temp = result[0]/10;
		result[0] %= 10; 
		if (temp>0)
		{
			resultstr = string(1,'0'+temp);
		}
	
		for( long i = 0; i < len -1; i++ )
		{
			
				string s(1,result[i]+'0');
				resultstr += "" + s ;

		}
		return resultstr;
	}

};
//大数的加法
class Addition
{
public:
	string  additon(string str1, string str2)
	 {
		 unsigned int  len1 = str1.size();
		 unsigned int  len2 = str2.size();
		 unsigned int  len  = len1 > len2 ? len1 : len2;
		 int * a = new int[len];
		 int * b = new int[len];
		 int *result = new int[len];//多一位用来处理最后一位的进位
		 fill(a,a+len,0),  fill(b, b+len,0), fill(result, result + len,0);
		 for (int i = 0; i <len1; i++)
		 {
			 a[i] = str1[i] -'0';
		 }
		 for (int j = 0; j <len2; j++)
		 {
			 b[j] = str2[j] -'0';
		 }
		 for (unsigned int i =len -1 ; i > 0; i--)//最高位
		 {
			result[i] += a[i] + b[i];
			if (result[i]>=10)
			{
				result[i] = result[i] -10;
				result[i - 1]++;
			}
			//cout << result[i] << endl;
		 }
		 //处理最高位
		 int temp =0;
		 result[0] += a[0] + b[0];
		 if (result[0] >= 10)
		 {
			 result [0] = result[0] -10;
			 temp = 1;
		 }
		 
		 string resultStr = "";
		 if (temp >0)
		 {
			 resultStr = string(1,'0' + temp);
		 }
		 
		for (int i =0; i< len; i++)
		{
			resultStr += string(1,'0' + result[i]);
		}
		
		return resultStr;
	 }
};
//大数减法
class Subtraction
{
public:
	string	subtraction(string str1, string str2)
	{
		int len1 = str1.length();
		int len2 = str2.length();
		int len = len1 > len2 ? len1 : len2;
		int  *a = new int[len];
		int  *b = new int[len];
		int *result = new int[len];
		fill(a,a+len,0);
		fill(b,b+len,0);
		fill(result,result+len,0);
		int  symbol = 1;//如果为-1 则表明是正数 如果是1 则是正数
		//处理计算结果是 正数 负数 的问题
		if (len1 < len2)
		{
			symbol = -1;
			
			string tmp ="";
			tmp = str1;
			str1 = str2;
			str2 = tmp;
			int it = len1;
			len1 = len2;
			len2 = it;
		}
		else if (len1 == len2)
		{
			for (int i =0 ; i< len ; i++)
			{
				if (str1[i] ==str2[i] )
				{
					continue;
				}
				else if (str1[i] < str2[i])
				{
					symbol = -1;

					string tmp ="";
					tmp = str1;
					str1 = str2;
					str2 = tmp;
					int it = len1;
					len1 = len2;
					len2 = it;
					break;
				}
				else
				{
					break;
				}
			}
		}
		
		for (int i = 0; i< len1; i++)
		{
			a[len1 - i -1] = str1[i]-'0';
		}
		for (int i = 0; i< len2; i++)
		{
			b[len2 - i - 1] = str2[i]-'0';
		}
		int jiewei = 0;
		for (int k =0; k <len ; k++)
		{
			//如果存在借位 这个位置
			if (jiewei == 0)
			{
				if (a[k] -b[k] < 0)
				{
					result[k] = a[k] - b[k] + 10;
					jiewei = 1;
				}
				else
				{

					result[k] = a[k] - b[k];
				}
			}
			else
			{
				if (a[k] - b[k] -1 <0)
				{
					result[k] = a[k] - b[k] -1 +10;
					jiewei = 1;
				}
				else
				{
					result[k] = a[k] - b[k] -1;
					jiewei = 0;
				}
			}
		}
		//0-n中 0是低位 那么要找第一个不为0的高位
		int nozero =0;
		for (int i = len -1; i >=0 ; i--)
		{
			if (result[i] !=0)
			{
				nozero = i;
				break;
			}
			
		}
		//输出结果

		string resultstr = "";
		if (symbol == -1)
		{
			resultstr = "-";
		}
		
		for (int i =nozero; i >= 0; i--)
		{
			resultstr += string(1,'0' + result[i]);
		}
		return resultstr;
	}
protected:
private:
};
class Division
{
public:
	string division(string str1, string str2)
	{
		//
		
	reverse(str1.begin(),str1.end());
	reverse(str2.begin(),str2.end());
	int len1 = str1.size();
	int len2 = str2.size();
	if (len1 -len2 < 0)
	{
		return "0";
	}
	int *a = new int[len1];
	int *b = new int[len1];
	fill(a, a + len1, 0),fill(b, b + len1, 0);
	
	for (int i = 0; i < len1; i++)
	{
		a[i]  = str1[i] -'0';
	}
	for (int i = 0; i < len2; i++)
	{
		b[i]  = str2[i] -'0';
	}
	int dValue = len1 - len2;
	int *result = new int[dValue +1];
	fill(result, result + dValue +1, 0);
	//被除数的处理
	for (int i = len1 - 1; i >=0; i--)
	{
		if (i >=dValue)
		{
			b[i] = b[i - dValue];//向高位移动
		}
		else
		{
			b[i] = 0;
		}
	}
	//
	for (int i =0 ; i < len1 ; i++)
	{
		cout << a[i];
	}
	cout <<endl;
	for (int i =0 ; i < len1 ; i++)
	{
		cout << b[i];
	}
	cout <<endl;
	len2 = len1;
	int flag  = 0;
	for (int j = 0; j <= dValue; j++)
	{
		while((flag = subtraction(a, len1, b+j, len2 - j)) != -1)//运算符的优先级
		{
			
			len1 = flag;
			result[j]++;//每一位的值
		}
	}
	
	//
	int high = dValue;
	for (int i =0; i<= dValue ; i++ )
	{
		if (result[i]>0)
		{
			high = i;
			break;
		}
	}	
	string resultstr = "";
	for (int i = high; i <= dValue; i++)
	{
		
		resultstr += string(1,result[i]+'0');
	}
	return resultstr;
	}
protected:
private:
	//数组0-N分别为待处理数据的从低到高的顺序
	int	subtraction(int * p1, int len1, int *p2, int len2)
	{
		if (len1 < len2)
		{
			return -1;
		}
		if (len1 == len2)
		{
			for (int i = len1 -1; i >=0; i--)
			{
				if (p1[i] > p2[i])
				{
					break;
				}
				else if (p1[i] < p2[i])
				{
					return -1;
				}
			}
			
		}
		
		for (int i =0; i <=len1 - 1; i++)
		{
			p1[i] -= p2[i];
			if (p1[i] < 0)
			{
				p1[i] +=10;
				p1[i+1]--;
			}
		}
		
		

	for (int i = len1 -1; i >=0; i--)
	{
		if (p1[i])
		{
			
			return i + 1;//返回最高位 数组是从 0 开始的 因而需要+1
		}
	}

	return 0;
	}
};


int main()
{
	string s1,s2;
	cin>>s1>>s2;
	Mutiply m;
	cout << m.mutiply(s1,s2) << endl;
	Addition a;
	cout << a.additon(s1, s2)<< endl;
	Subtraction s;
	cout <<s.subtraction(s1, s2)<<endl;
	Division d;
	cout<<	d.division(s1,s2);
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_39804483/article/details/87879014