带符号的高精度数加减

目前只写了加减,乘除以后再补上。

还有构造函数那里,应该考虑输入的string不是数字怎么办.,再写个checkstring就好了。


#include<iostream>
#include<string>
#include<vector>
using namespace std;

class Interger
{
	private:
		bool isneg;//正负
		int size;//不算正负号,忽略前边的0(应该是这样,但是构造没处理零,不过加减的结果前边没有零),数的长度
		string str;
		vector<int> vec;//这里边倒序储存着str,用来中转,计算 。 
	public:
		Interger()
		{
			size = 0;
			str = "";
			vec.resize(0);
		} 
		Interger(string str)
		{
			//cout<<"构造"<<endl; 
			if(str[0] == '+' || str[0] == '-')
			{
				isneg = (str[0] == '-' ? true:false);
				this->size = str.size()-1;
				this->str = str.substr(1,str.size()-1);
				for(int i=str.size()-1; i>=1; i--)
					vec.push_back(str[i] - '0');
			}
			else
			{
				this->size = str.size();
				isneg = false;
				this->str = str;
				for(int i=str.size()-1; i>=0; i--)
					vec.push_back(str[i] - '0');
			}
		}
		Interger(const Interger &fuck)
		{
			//cout<<"copy构造"<<endl;
			this->isneg = fuck.isneg;
			this->size = fuck.size;
			this->str = fuck.str;
			this->vec.resize(fuck.size);
			for(int i=0;i<size;i++)
				this->vec[i] = fuck.vec[i];
		}
		bool bigger(Interger &fuck)
		{
			if(this->size < fuck.size)
				return 0;
			else if(this->size == fuck.size)	
			{
				int num = this->size;
				for(int i=num-1; i>=0;i--)
				{
					if(this->vec[i] == fuck.vec[i])
						continue;
					else if(this->vec[i] < fuck.vec[i])
						return 0;
					else
						return 1;
				}
			}
			else
				return 1;
		}
		
		Interger& operator=(const Interger &fuck)
		{
			//cout<<"赋值"<<endl;
			if(this == &fuck)
				return *this;
			this->isneg = fuck.isneg;
			this->size = fuck.size;
			this->str = fuck.str;
			vec.resize(fuck.size);
			for(int i=0;i<size;i++)
				vec[i] = fuck.vec[i];
			return *this;
		}
		/*
		Interger& operator+=(const Interger &fuck)
		{
			int numsize = max(this->size, fuck.size);
			this->vec.resize(numsize+1);
			this->str.clear();
			
			for(int i=0; i<numsize; i++)
			{
				int index = this->vec[i];
				if(i <fuck.size)
					index += fuck.vec[i];
				if(index>=10)
				{
					this->vec[i+1] += 1;
					index -= 10;
				}
				this->vec[i] = index;
			}
			for(int i=this->vec.size()-1; i>=0; i--)
				this->str.push_back(this->vec[i] + '0'); 
			
			this->size =this->vec.size();
			return *this;
		}
		*/
		Interger operator+(Interger &fuck)
		{	
			if(this->isneg == false && fuck.isneg == true)//负加正 
			{
				Interger temp = fuck;
				temp.isneg = false;
				return (*this) - temp;
			} 
			else if(this->isneg == true && fuck.isneg == false)//正加负
			{
				return fuck + (*this);
			}
			
			Interger in;
			if(this->isneg == true && fuck.isneg == true )//负加负 
				in.isneg = true;
			else if(this->isneg == false && fuck.isneg == false)//正加正 
				in.isneg = false;
			int numsize = max(this->size, fuck.size);
			in.vec.resize(numsize+1,0); 
			for(int i=0; i<numsize+1; i++)
			{
				int index = in.vec[i];
				if(i < this->size)
					index += this->vec[i];
				if(i <fuck.size)
					index += fuck.vec[i];
				if(index>=10)
				{
					in.vec[i+1] = 1;
					index -= 10;
				}
				in.vec[i] = index;
			}
			for(int i=in.vec.size()-1; in.vec[i] == 0 && i!=0;i--)//处理多余的零 
				in.vec.pop_back();
			for(int i=in.vec.size()-1; i>=0; i--)
			{
				in.str.push_back(in.vec[i] + '0'); 
			}
			in.size =in.vec.size();
			return in;
		}
		
		Interger operator-(Interger &fuck)
		{
			if(this->isneg == false && fuck.isneg == true )//正减负 
			{
				Interger temp = fuck;
				temp.isneg = false;
				return (*this) + temp;
			}
			else if(this->isneg == true && fuck.isneg == false)//负减正 变为负加负 
			{
				Interger temp = fuck;
				temp.isneg = true;
				return (*this) + temp;
			}
			else if(this->isneg == true && fuck.isneg == true)//负减负 变为 正减正 
			{
				Interger temp1 = (*this);
				Interger temp2 = fuck;
				temp1.isneg = false;
				temp2.isneg = false;
				return temp1 - temp2;
			}
			Interger in;
			if(bigger(fuck))
				in.isneg = false; 
			else 
			{
				Interger temp = fuck-(*this);
				temp.isneg = true;
				return temp;
			}
			int numsize = max(this->size, fuck.size);
			in.vec.resize(numsize,0); 
			for(int i=0; i<numsize; i++)
			{
				int index = in.vec[i];
				if(i < this->size)
					index += this->vec[i];
				if(i <fuck.size)
					index -= fuck.vec[i];
				if(index<0)
				{
					in.vec[i+1] = -1;
					index += 10;
				}
				in.vec[i] = index;
				//cout<<"in.vec[i]"<<in.vec[i];
			}
			
			for(int i=in.vec.size()-1; in.vec[i] == 0 && i!=0;i--)//处理多余的零 
				in.vec.pop_back();
			for(int i=in.vec.size()-1; i>=0; i--)
			{
				in.str.push_back(in.vec[i] + '0'); 
			}
			in.size =in.vec.size();
			return in;
		 } 
		 
		void display()
		{
			if(this->isneg == true)
				cout<<"-";
			cout<<this->str<<endl;
		}
} ;

int main()
{
	string s1, s2;
	cin>>s1>>s2;
	Interger fuck1;
	Interger temp(s1);
	fuck1 = temp;
	Interger fuck2(s2);
	
	//fuck1.operator+=(fuck2);
	//fuck1.display();
	temp = fuck1+fuck2;
	temp.display();
	
	(fuck1-fuck2).display();
	//temp.display();
	
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值