大数计算 c++实现

本文介绍如何使用C++实现大数计算,包括存储结构设计、加减乘除的逻辑实现。通过将数存储为字符串,重载运算符,实现了大数的加法、减法、乘法和除法。乘法和除法通过复用加法和减法来完成,但存在效率低和精度有限的问题。
摘要由CSDN通过智能技术生成

为实现一个不会溢出的四则运算计算器,我们需要将数据存入字符串中,并自己实现加减乘除的逻辑。

存储结构设计:

为了方便计算,将符号位,整数部分,小数部分分别存储

enum SIGN
{
	POSITIVE,
	NEGATIVE
};

class Num
{
protected:
	SIGN _sign;        //符号位
	string _int;       //整数位
	string _float;     //小数位
public:
	Num()
		:_sign(POSITIVE)
	{}
}

分别重载常见运算符,并定义拷贝构造函数

	bool operator>(Num& a)
	{
		if(IsZero(*this)&&IsZero(a))
			return false;
		if(_sign==NEGATIVE&&a._sign==POSITIVE)
			return false;
		else if(_sign==POSITIVE&&a._sign==NEGATIVE)
			return true;

		if(_sign==POSITIVE&&a._sign==POSITIVE)
		{
			if(_int.length()>a._int.length())
				return true;
			else if(_int.length()<a._int.length())
				return false;
			else if(_int.length()==a._int.length())
			{
				if(strcmp(_int.c_str(),a._int.c_str())<0)
					return false;
				else if(strcmp(_int.c_str(),a._int.c_str())>0)
					return true;
				else if(strcmp(_int.c_str(),a._int.c_str())==0)
				{
				string::iterator it1=_float.begin();
				string::iterator it2=a._float.begin();

				while(it1!=_float.end()&&it2!=a._float.end())
				{
					if(*it1<*it2)
						return false;
					it1++;
					it2++;
				}
				while(it2!=a._float.end())
				{
					return false;
				}
				while(it1!=_float.end())
				{
					return true;
				}
				}
				return false;
			}
		}

		if(_sign==NEGATIVE&&a._sign==NEGATIVE)
		{
			if(_int.length()>a._int.length())
				return false;
			else if(_int.length()<a._int.length())
				return true;
			else if(_int.length()==a._int.length())
			{
				if(strcmp(_int.c_str(),a._int.c_str())<0)
					return true;
				else if(strcmp(_int.c_str(),a._int.c_str())>0)
					return false;
				else if(strcmp(_int.c_str(),a._int.c_str())==0)
				{
				string::iterator it1=_float.begin();
				string::iterator it2=a._float.begin();

				while(it1!=_float.end()&&it2!=a._float.end())
				{
					if(*it1<*it2)
						return true;
					else if(*it1>*it2)
						return false;
					it1++;
					it2++;
				}
				while(it1!=_float.end())
				{
					return false;
				}
				while(it2!=a._float.end())
					return true;
				}
				return false;
			}
		}
		return true;
	}

	bool operator==(Num& a)
	{
		if(IsZero(*this)&&IsZero(a))
			return true;
		if(_sign==NEGATIVE&&a._sign==POSITIVE)
			return false;
		else if(_sign==POSITIVE&&a._sign==NEGATIVE)
			return false;

		if(_int.length()!=a._int.length()||_float.length()!=a._float.length())
			return false;
		else if(_int.length()==a._int.length()&&strcmp((_int.c_str()),a._int.c_str())!=0)
			return false;
		else if(_float.length()==a._float.length()&&strcmp((_float.c_str()),a._float.c_str())!=0)
			return false;

		return true;
	}

	bool operator<(Num& a)
	{
	return !(*this>a||*this==a);
	}

	bool operator>=(Num& a)
	{
	return *this>a||*this==a;
	}

	bool operator<=(Num& a)
	{
	return *this<a||*this==a;
	}

	Num& operator=(Num a)
	{
		_float=a._float;
		_int=a._int;
		_sign=a._sign;
		return *this;
	}
	Num(Num& a)
	{
		_sign=a._sign;
		_int=a._int;
		_float=a._float;
	}

实现加法部分的逻辑

思路:

1.区别同号,异号相加

2.同号相加:从小数部分开始

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值