大整数类的实现包含了加减乘除运算

大整数在笔面试中也是常考的,所以抽时间自己实现了一个大整数类,思想是通过一个vector 来存储数据,每一个元素代表万进制大整数中的一位。具体程序如下:

#include "stdafx.h"
#include 
#include 
#include 
#include 
#include 
using namespace std;

class BigInt
{
public:
	//利用字符串来构造一个大整数
	BigInt(string s)
	{
		int left=0;
		symbol=1; //默认为正数  
		if (s.size()>0)
		{
			if (s[0]=='-')
			{
				symbol=-1;
				left=1;
			}
			else if (s[0]=='+')
			{
				
				left=1;
			}
		}
		for (int i=s.size();i>left;i-=REDIX_LEN)
		{
			int low=max(i-REDIX_LEN,left);
			int result=0;
			for (int j=low;j=0;--i)
		{	
			if (flag)  //跳过了最高位,每一位都需要以四位长度等宽输出,不足左边补0
			{
				result< z(maxLen,0);
		int i=0;
		for (;isymbol==1 && rhs.symbol==1)  //两个正数相加
		{
			return add(*this,rhs);
		}
		else if (this->symbol==-1 && rhs.symbol==-1)  //两个负数相加
		{
			BigInt tmp=add(*this,rhs);
			tmp.symbol=-1;
			return tmp;
		}
		else if (this->symbol==1)    //正数加上负数
		{
			if (*this>=rhs)
			{
				return sub(*this,rhs);
			}
			else
			{
				BigInt tmp=sub(rhs,*this);
				tmp.symbol=-1;
				return tmp;
			}
		}
		else            //负数加上正数
		{
			if (*this>=rhs)
			{
				BigInt tmp=sub(*this,rhs);
				tmp.symbol=-1;
				return tmp;
			}
			else
			{
				return sub(rhs,*this);
			}
		}
	}

	//x必须大于y,且两者都非负
	static BigInt sub(const BigInt &x,const BigInt &y)
	{
		vector z(x.elem.size()+1,0);  //因为x>y所以,x-y位数不会超过x的位数+1
		int i=0;
		for (;isymbol==1 && rhs.symbol==1)  //正数减正数
		{
			if (*this>=rhs)
			{
				return sub(*this,rhs);
			}
			else
			{
				BigInt tmp=sub(rhs,*this);
				tmp.symbol=-1;
				return tmp;
			}

		}
		else if (this->symbol==-1 && rhs.symbol==-1)  //负数减负数
		{
			if (*this>=rhs)
			{
				BigInt tmp=sub(*this,rhs);
				tmp.symbol=-1;
				return tmp;
			}
			else
			{
				return sub(rhs,*this);
			}
		}
		else if (this->symbol==1)   //正数减负数
		{
			return add(*this,rhs);
		}
		else                        //负数减正数
		{
			BigInt tmp=add(*this,rhs);
			tmp.symbol=-1;
			return tmp;
		}
	}
	//判断个大整数的绝对值大小
	bool operator>=(const BigInt &rhs)
	{
		if (this->elem.size()>rhs.elem.size())
		{
			return true;
		}
		else if (this->elem.size()elem.size()-1;i>=0;--i)
			{
				if (this->elem[i] z(x.elem.size()+y.elem.size(),0);
		for (int i=0;i z(x.elem.size()+1,0);
		vector tmpY(x.elem.size(),0);
		BigInt tmpX(x);
		const int times=x.elem.size()-y.elem.size();
		//tmpY看成y中elem的副本左移到和x中elem位数一样多的结果
		for (int i=x.elem.size()-1;i>=0 ;--i)
		{
			if (i>=times)
			{
				tmpY[i]=y.elem[i-times];
			}
			else
			{
				tmpY[i]=0;
			}
		}
		/* 先减去若干个 y×(10000 的 times 次方),
		不够减了,再减去若干个 y×(10000 的 times-1 次方)
		一直减到不够减为止 */
		for (int i=0;i<=times;++i)
		{
			const BigInt tmpInt(tmpY,1);
			while(tmpX>=tmpInt)
			{
				++z[times-i];
				tmpX=sub(tmpX,tmpInt);
			}
			for (int j=0;j vec,int flag):elem(vec),symbol(flag){};
	vector elem;  //大整数的数据,每一个元素代表万进制中的一位
	int symbol; //1为正,-1为负
	//万进制的数,vector中的每一个元素当做大整数的万进制的一位
	static const int REDIX_LEN=4;
	static const int BIGINT_REDIX=10000;

};

int _tmain(int argc, _TCHAR* argv[])
{
	string x;
	string y;
	while(cin>>x>>y)
	{
		BigInt first(x),second(y);
		cout<<"两个数的和为: "<<(first+second).toString()<
程序运行结果如下:

大整数类的实现包含了加减乘除运算_第1张图片

你可能感兴趣的:(面试手写代码)