大整数计算类(浮点类未完成)

#include<iostream>
#include<list>
#include<string>
#include<cstdio>
#include<cctype>
#include<cmath>
using namespace std;
/***************************************************************************** 
*类名称:InterCalc
*类描述:大整数计算 可以和基本类型运算 
*类功能:+,-,>,<,=,>=,<=,==,*,/,*=,/=,+=,-=,++,--和正负号;
*可以实现和能自动转换成long long类型的基本数据运算 左操作数必须为大整数类型	 		
*类参考:算法来源于网络加以修正BUG 		
*编写人:十二年 710055071
*编写时间:2015-03-25至2015-03-31  
******************************************************************************/
class FloatCalc; //向前声明 
class InterCalc{
	list<char> num;										      //存储大整数的变量 
	friend void buwei(InterCalc& left,InterCalc& right);	  //对齐两个大整数的位数 声明友元  非成员函数
	//void buwei(InterCalc& Left,InterCalc& Right); 
	friend void xsbuwei(FloatCalc& Left,FloatCalc& Right);
public:  
	//构造函数 注:去空位输入 除去前面多余的零  省略第一个点以后的数据 
	//用string类型初始化 大整数对象 
    InterCalc( const    string& Input );
	InterCalc( const InterCalc& Input );    				  //复制构造函数
	InterCalc( const long long Input ); 					  //用long long 类型初始化 
	InterCalc(){}											  //默认构造函数
	friend class FloatCalc;									  //声明为友元  FloatCalc 类中可以访问 InterCalc 私有成员 
	void Print() const;										  //去空位输出输出数据 
	friend ostream& operator<<(ostream& out,const InterCalc& Output);//输出  
	friend istream& operator>>(istream& cin,const InterCalc& Input);//输入 
	bool iszero() const;									  //判断大整数是否为零
	 
	bool operator>( const InterCalc& Right ) const;			  //大于操作符 
	bool operator<( const InterCalc& Right ) const;			  //小于操作符 
	bool operator>=(const InterCalc& Right ) const;			  //大于等于操作符 
	bool operator<=(const InterCalc& Right ) const;			  //小于等于操作符 
	bool operator==(const InterCalc& Right ) const;			  //判断数值是否相等 
	const InterCalc& operator+() const;					 	  //
	const InterCalc& operator-();							  //
	const InterCalc& operator++();							  //前置操作	 
	const InterCalc  operator++(int);					 	  //后置操作 
	const InterCalc& operator--();							  // 
	const InterCalc  operator--(int);						  //
	const InterCalc operator+( const InterCalc& Right ) const;//加法运算 
	const InterCalc operator-( const InterCalc& Right ) const;//除法运算 
	const InterCalc operator*( const InterCalc& Right ) const;//乘法运算 
	const InterCalc operator/( const InterCalc& Right ) const;//除法运算		
	const InterCalc operator%( const InterCalc& Right ) const;//求余运算		 
	//实际上 有的是在函数内部进行了传值操作 
	const InterCalc& operator= ( const InterCalc& Right );	  //赋值操作符  注意 没做自身赋值的检查 
	const InterCalc& operator+=( const InterCalc& Right );	  // += 运算
	const InterCalc& operator-=( const InterCalc& Right );	  // -= 运算 
	const InterCalc& operator*=( const InterCalc& Right );	  // *= 运算 
	const InterCalc& operator/=( const InterCalc& Right );	  // /= 运算 		
};
istream& operator>>(istream& cin,InterCalc& Input)
{	
	string str;
	cin>>str;
	Input=str; 
	return cin;
}
ostream& operator<<(ostream& out,const InterCalc& Output)
{
	if(Output.iszero())
	{
		cout<<0;
	}
	else
	{ 
		list<char>::const_iterator iter=Output.num.begin();
		if(*iter=='-'){ cout<<*iter++; }
		while(*iter=='0')
		{
			++iter;
		}
		for(;iter!=Output.num.end();++iter)
		{
			cout<<*iter;	
		}
	}
	return out;
}
InterCalc::InterCalc(const long long Input )
{	
	long long input=Input;
	int flag=0;
	if(input<0)
	{
		flag=1;
		input=-input;
	}
	while(input/10!=0)
	{
		num.push_front(input%10+'0');
		input/=10;
	}
	num.push_front(input+'0');
	if(flag)
		num.push_front('-');
}
InterCalc::InterCalc( const InterCalc& Input )//复制构造函数 
{
	num = Input.num;
}
InterCalc::InterCalc( const string& Input ) //使用字符串初始化 
{
		int err=0,i=0,sign=0;
		if(Input[0]=='+') ++i;
		if(Input[0]=='-')
		{
			sign=1;
			++i;
		}
		while(Input[i]=='0')
				++i; 
		for(; i<Input.length() ; ++i )
		{
			if(Input[i]!='.')
			{
				if(Input[i] >= '0' && Input[i] <= '9' )
				{
					num.push_back( Input[i] );
				}
				else
				{
					cout<<i+1<<"位输入数据有误"<<endl;
					err+=1; 	
				}
			}
			else
			{
				break;
			}
		}
		if(sign)
			num.push_front('-');
		if(err)
		{
		cout<<"一共有"<<err<<"处错误"<<endl;
		cout<<"请忽略结果重新输入数据"<<endl;
		num.clear();
		//num.push_front('0');
		}	
}
void InterCalc::Print() const//打印自己 
{
	/*if(this->iszero())
	{
		cout<<0;
	}
	else
	{ 
		list<char>::const_iterator iter=num.begin();
		if(*iter=='-'){ cout<<*iter++; }
		while(*iter=='0')
		{
			++iter;
		}
		for(;iter!=num.end();++iter)
		{
			cout<<*iter;	
		}
	}*/
	//cout<<endl;
	list<char>::const_iterator iter=num.begin();
	for(;iter!=num.end();++iter)
	cout<<*iter;
}
bool InterCalc::iszero() const
{
	list<char>::const_iterator iter=num.begin();
	int flag=1;
	if(*iter=='-'||*iter=='+'){ *iter++; }
	for(;iter!=num.end();++iter)
	{
		if(*iter=='0'&&flag)
		{
			continue;
		}
		else
		{
			flag=0;
			return false;
		}
	}
	if(flag==1)
	{
		return true;
	}
} 
void buwei(InterCalc& Left,InterCalc& Right)//补齐两个大整数的位数  非成员函数 类内部声明为友元 才能访问私有数据 
//void InterCalc::buwei(InterCalc& Left,InterCalc& Right)
{
		int len1,len2;
		len1=Left.num.size();
		len2=Right.num.size();
		if( len1 >= len2 )
	 	{	
	 		for(int i=0 ; i<len1-len2 ; ++i )
	 		Right.num.push_front('0');
		 }
		 else
		 {
		 	for(int i=0 ; i<len2-len1 ; ++i)
		 	Left.num.push_front('0');
		 }
}				 
const InterCalc& InterCalc::operator+() const
{
	return *this;
}
const InterCalc& InterCalc::operator-() 
{
	*(this->num.begin())=='-'? this->num.pop_front():this->num.push_front('-');
	return *this; 
}
const InterCalc& InterCalc::operator++()
{
	return (*this)+=1;//s 自动发生了转换成InterCalc 因为有string 参数的构造函数 
}					 
const InterCalc InterCalc::operator++(int)
{
	InterCalc ans(*this);
	(*this)+=1;
	return ans;
}					 
const InterCalc& InterCalc::operator--()
{
	return (*this)-=1;
}				 
const InterCalc InterCalc::operator--(int)
{
	InterCalc ans(*this);
	(*this)-=1;
	return ans;
}
const InterCalc& InterCalc::operator=( const InterCalc& Right )//赋值操作符重载 
{
	num = Right.num;
	return *this;
}
bool InterCalc::operator>(const InterCalc& Right ) const
{
		InterCalc left(*this);
		InterCalc right(Right);
		list<char>::iterator iter1,iter2;
		iter1=left.num.begin();
		iter2=right.num.begin();
		if( (*iter1) == '-' && (*iter2) == '-')//如果两个数都是负数 
		{
			left.num.pop_front();
			right.num.pop_front();
			buwei(left,right);//定义成成员函数式 必须left right 调用 不能用this 
			return !(left.num>=right.num);
		}
		else if( (*iter1) == '-' && (*iter2) != '-')//如果一个是负数 一个是正数 
		{
			return false;
		}
		else if( (*iter1) != '-' && (*iter2) == '-')//如果一个是正数 一个是负数 
		{
			return left.iszero() &&right.iszero()?false:true;	
		}
		else//两个正数 
		{
			buwei(left,right);
			return left.num>right.num;
		}		
} 
bool InterCalc::operator<(const InterCalc& Right ) const
{
		InterCalc left(*this);
		InterCalc right(Right);
		list<char>::iterator iter1,iter2;
		iter1=left.num.begin();
		iter2=right.num.begin();
		if( (*iter1) == '-' && (*iter2) == '-')//如果两个数都是负数 
		{
			left.num.pop_front();
			right.num.pop_front();
			buwei(left,right);
			return !(left.num<=right.num);
		}
		else if( (*iter1) == '-' && (*iter2) != '-')//如果一个是负数 一个是正数 
		{
			return left.iszero() &&right.iszero()?false:true;
		}
		else if( (*iter1) != '-' && (*iter2) == '-')//如果一个是正数 一个是负数 
		{
			return false;
		}
		else//两个正数 
		{
			buwei(left,right);
			return left.num<right.num;
		}		
}
bool InterCalc::operator>=(const InterCalc& Right ) const
{
		InterCalc left(*this);
		InterCalc right(Right);
		list<char>::iterator iter1,iter2;
		iter1=left.num.begin();
		iter2=right.num.begin();
		if( (*iter1) == '-' && (*iter2) == '-')//如果两个数都是负数 
		{
			left.num.pop_front();
			right.num.pop_front();
			buwei(left,right);
			return !(left.num>right.num);
		}
		else if( (*iter1) == '-' && (*iter2) != '-')//如果一个是负数 一个是正数 
		{
				
			return left.iszero() &&right.iszero()?true:false;
		}
		else if( (*iter1) != '-' && (*iter2) == '-')//如果一个是正数 一个是负数 
		{
			return true;
		}
		else//两个正数 
		{
			buwei(left,right);
			return left.num>=right.num;
		}	
}
bool InterCalc::operator<=(const InterCalc& Right ) const
{
	    InterCalc left(*this);
		InterCalc right(Right);
		list<char>::iterator iter1,iter2;
		iter1=left.num.begin();
		iter2=right.num.begin();
		if( (*iter1) == '-' && (*iter2) == '-')//如果两个数都是负数 
		{
			left.num.pop_front();
			right.num.pop_front();
			buwei(left,right);
			return !(left.num<right.num);
		}
		else if( (*iter1) == '-' && (*iter2) != '-')//如果一个是负数 一个是正数 
		{
			return true;
		}
		else if( (*iter1) != '-' && (*iter2) == '-')//如果一个是正数 一个是负数 
		{			
		return left.iszero() &&right.iszero()?true:false;
		}
		else//两个正数 
		{
			buwei(left,right);
			return left.num<=right.num;
		}		
}
bool InterCalc::operator==(const InterCalc& Right )	const
{
		InterCalc left(*this),right(Right);	
		list<char>::iterator iter1,iter2;
		iter1=left.num.begin();
		iter2=right.num.begin();
		if( (*iter1) == '-' && (*iter2) == '-')//如果两个数都是负数 
		{
			left.num.pop_front();
			right.num.pop_front();
			buwei(left,right);
			return left.num==right.num;
		}
		else if( (*iter1) == '-' && (*iter2) != '-')//如果一个是负数 一个是正数 
		{
		return left.iszero() &&right.iszero()?true:false;
		}
		else if( (*iter1) != '-' && (*iter2) == '-')//如果一个是正数 一个是负数 
		{
		return left.iszero() &&right.iszero()?true:false;	
		}
		else//两个正数 
		{
			buwei(left,right);
			return left.num==right.num;
		}	
}
const InterCalc InterCalc::operator+( const InterCalc& Right ) const 
{
	InterCalc ans;
	InterCalc left(*this);
	InterCalc right(Right);
	if(left.iszero()&&right.iszero())
	{
		return ans;
	}
	list<char>::iterator iter1;
	list<char>::const_iterator iter2;
	iter1 = left.num.begin();
	iter2 = right.num.begin();
	int sign = 0;
	if( (*iter1) == '-' && (*iter2) == '-')//如果两个数都是负数 
	{
		left.num.pop_front();
		right.num.pop_front();
		sign=1;//标记结果符号 1表示负数 
		ans=left+right;
		ans.num.push_front('-');
	}
	else if( (*iter1) == '-' && (*iter2) != '-')//如果一个是负数 一个是正数 
	{
		 left.num.pop_front();
		 ans=right-left;
	}
	else if( (*iter1) != '-' && (*iter2) == '-')//如果一个是正数 一个是负数 
	{
		right.num.pop_front();
		ans=left-right;
	}
	else								//如果都为正 
	{
		buwei(left,right);
		int carry=0,i;
		iter1 = left.num.end();
		iter2 = right.num.end();
		--iter1;
		--iter2;
		for( ; (iter1 != left.num.begin()) && (iter2 != right.num.begin()) ; --iter1,--iter2 )
		{
			i=(*iter1-'0')+(*iter2-'0')+carry;
			ans.num.push_front((i%10)+'0');
			carry=i/10;		
		}
		i=(*iter1-'0')+(*iter2-'0')+carry;
		ans.num.push_front((i%10)+'0');
		carry=i/10;
		if( carry )
		{
			ans.num.push_front(carry+'0');
		}	
	}	 
	 return ans;
}
const InterCalc InterCalc::operator-( const InterCalc& Right ) const
{
	InterCalc ans;
	InterCalc left(*this);
	InterCalc right(Right);
	int sign=0;
	list<char>::iterator iter1,iter2;
	list<char>::iterator iterb1,iterb2;
	int len1,len2;
	iter1 = left.num.begin();
	iter2 = right.num.begin();
	if( (*iter1) == '-' && (*iter2) == '-')//两个负数 
	{
		left.num.pop_front();
		right.num.pop_front();
		ans=right-left;
	}
	else if( (*iter1) == '-' && (*iter2) != '-' )//一负一正 
	{
		left.num.pop_front();
		ans=left+right;
		ans.num.push_front('-');
	}
	else if( (*iter1) != '-' && (*iter2) == '-' )//一正一负 
	{
		right.num.pop_front();
		ans=left+right;
	 }
	 else
	 {
		 buwei(left,right);
		 int carry=0,i;
		 //需要判断大小 
		 if(left>=right)
		 {
		 iter1 =left.num.end();
		 iterb1=left.num.begin();
		 iter2 =right.num.end();
		 iterb2=right.num.begin();
		 }
		else
		{
		 iter2 =left.num.end();
		 iterb2=left.num.begin();
		 iter1 =right.num.end();
		 iterb1=right.num.begin();
		 sign=1;
		}
		 --iter1;
		 --iter2;
		 //上面交换迭代器时 下面如果不交换判断 造成不同容器迭代器的比较  时间长了 耗尽资源 电脑卡死
		 //算不算病毒的一种啊 
		 for( ; ( iter1 != iterb1 ) && ( iter2 != iterb2 ); --iter1,--iter2 )
		 {
		 	i=(*iter1-'0'-carry)-(*iter2-'0');
		 	carry=0;
		 	if(i<0)
		 	{
		 		i += 10;
		 		carry = 1;
			 }
			 ans.num.push_front((i%10)+'0');
		  } 
		  i=(*iter1-'0'-carry)-(*iter2-'0');
		  if(i) ans.num.push_front(i+'0');
		  if(sign) ans.num.push_front('-');
	  } 
	return  ans;
}
const InterCalc& InterCalc::operator+=( const InterCalc& Right )
{
	return *this=*this+Right;	
}
const InterCalc& InterCalc::operator-=( const InterCalc& Right )
{
	return *this=*this-Right;
}
const InterCalc InterCalc::operator*( const InterCalc& Right) const //乘法 
{
	InterCalc left(*this),right(Right),ans;
	int sign=0;
	int len1,len2,len;
	list<char>::iterator iter1,iter2,iter;
	InterCalc high,low;
	InterCalc anshigh,anslow;
	int th,tl;
	int i,j,k;
	if(left.num.size()==1&&right.num.size()==1)
	{
		th=*(left.num.begin())-'0';
		tl=*(right.num.begin())-'0';
		th*=tl;
		ans.num.push_front(th%10+'0');
		ans.num.push_front(th/10+'0');
		return ans;
	}
	else if(left.num.size()==1&&right.num.size()>1)
	{
		if(*(right.num.begin())=='-')
		{
			sign=1;
			right.num.pop_front();
		}
		len2=right.num.size();
		if(len2==1)
		{
			ans=left*right;
			if(sign)
			ans.num.push_front('-');
		}
		else
		{
			for(iter=right.num.begin(),i=0;i<len2/2;++i,++iter)
			{
				high.num.push_back(*iter);
			}
			for( ;iter!=right.num.end();++iter)
			{
				low.num.push_back(*iter);
			}
			len=low.num.size();
			anshigh=left*high;
			anslow=left*low;
			for(i=0;i<len;++i)
				anshigh.num.push_back('0');
			ans=anshigh+anslow;
			if(sign)
				ans.num.push_front('-');
		}
		return ans;
	}
	else if(right.num.size()==1&&left.num.size()>1)
	{
		if(*(left.num.begin())=='-')
		{
			sign=1;
			left.num.pop_front();	
		}
		len2=left.num.size();
		if(len2==1)
		{
			ans=left*right;
			if(sign)
			ans.num.push_front('-');	
		}
		else
		{
			for(iter=left.num.begin(),i=0;i<len2/2;++i,++iter)	
			{
				high.num.push_back(*iter);
			}
			for( ;iter!=left.num.end();++iter)
			{
				low.num.push_back(*iter);
			}
			len=low.num.size();
			anshigh=right*high;
			anslow=right*low;
			for(i=0;i<len;++i)
				anshigh.num.push_back('0');
			ans=anshigh+anslow;
			if(sign)
				ans.num.push_front('-');
		}
		return ans;
	}
	else
	{
		InterCalc lefthigh,leftlow,righthigh,rightlow;
		int flag1=0,flag2=0;
		if(*(left.num.begin())=='-')
		{
			flag1=1;
			left.num.pop_front();
		}
		if(*(right.num.begin())=='-')
		{
			flag2=1;
			right.num.pop_front();
		}
		if((flag1==1&&flag2==0)||(flag1==0&&flag2==1))
		{
			sign=1;
		}
		len1=left.num.size();
		len2=right.num.size();
		if(len1==1||len2==1)
		{
			ans=left*right;
			if(sign)
			ans.num.push_front('-');
		}
		else
		{
			for(iter=left.num.begin(),i=0;i<len1/2;++iter,++i)
				lefthigh.num.push_back(*iter);
			for( ; iter!=left.num.end();++iter)
				leftlow.num.push_back(*iter);
			for(iter=right.num.begin(),i=0;i<len2/2;++iter,++i)
				righthigh.num.push_back(*iter);
			for( ; iter!=right.num.end();++iter)
				rightlow.num.push_back(*iter);
			int a=(len1+1)/2;
			int b=(len2+1)/2;
			InterCalc AC,AD,BC,BD;
			AC=lefthigh*righthigh;
			AD=lefthigh*rightlow;
			BC=leftlow*righthigh;
			BD=leftlow*rightlow;
			for(i=0;i<a+b;++i)
				AC.num.push_back('0');
			for(i=0;i<a;++i)
				AD.num.push_back('0');
			for(i=0;i<b;++i)
				BC.num.push_back('0');
			ans=AC+AD;
			ans=ans+BC;
			ans=ans+BD;
			while(*ans.num.begin()=='0')
			{
				ans.num.pop_front();
			}
			if(sign)
				ans.num.push_front('-');
		}
		return ans;		
	}
}
const InterCalc InterCalc::operator/( const InterCalc& Right) const//除法 
{
	InterCalc left(*this),right(Right);
	//先判断 除数与被除数为零的情况 
	if(right.iszero())
	{
		cout<<"除数不能为零!!!"<<endl;
		cout<<"请遵守规则哦!!!"<<endl;
		return InterCalc(); 
	 } 
	InterCalc ans,temp;
	int len1,len2,len;
	int i,j,k;
	int sign=0;
	int flag1=0,flag2=0;
	list<char>::iterator iter;
	if(*(left.num.begin())=='-')
	{
		flag1=1;
		left.num.pop_front();
	}
	if(*(right.num.begin())=='-')
	{
		flag2=1;
		right.num.pop_front();
	}
	if((flag1==1&&flag2==0)||(flag1==0&&flag2==1))
	sign=1;
	len1=left.num.size();
	len2=right.num.size();
	if(len1<len2)
	{
		ans.num.push_front('0');
		temp=right;
		return ans;
	}
	else
	{
		for(iter=left.num.begin(),i=0;i<len2;++i,++iter)
		{
			temp.num.push_back(*iter);
		}
		InterCalc digit,res;
		for(j=0;j<10;++j)
		{
			digit.num.clear();
			digit.num.push_back(j+'0');
			res=right*digit;
			res=temp-res;
			if(*(res.num.begin())=='-')
				break;	
		}
		j-=1;
		if(j>0)
		{
			digit.num.clear();
			digit.num.push_back(j+'0');
			res=right*digit;//后添加的 
			temp=temp-res;//原来是temp=temp+right
			ans.num.push_back(j+'0');
		}
		for( ;iter!=left.num.end();++iter)
		{
			temp.num.push_back(*iter);
			for(j=0;j<10;++j)
			{
				digit.num.clear();
				digit.num.push_back(j+'0');
				res=right*digit;
				res=temp-res;
				if(*(res.num.begin())=='-')
					break;
			}
			j-=1;
			digit.num.clear();
			digit.num.push_back(j+'0');
			res=right*digit;
			temp=temp-res;
			ans.num.push_back(j+'0');
		}
		if(sign)
		{
			temp.num.push_front('-');//改后添加的代码 
			ans.num.push_front('-');
		} 
	 } 
	 //ans 是商  temp是余数 
	return  ans;
}
const InterCalc InterCalc::operator%( const InterCalc& Right ) const
{
	InterCalc left(*this),right(Right);
	//先判断 除数与被除数为零的情况  改后添加代码 
	if(right.iszero())
	{
		cout<<"除数不能为零!!!"<<endl;
		cout<<"请遵守规则哦!!!"<<endl;
		return InterCalc(); 
	 } 
	InterCalc ans,temp;
	int len1,len2,len;
	int i,j,k;
	int sign=0;
	int flag1=0,flag2=0;
	list<char>::iterator iter;
	if(*(left.num.begin())=='-')
	{
		flag1=1;
		left.num.pop_front();
	}
	if(*(right.num.begin())=='-')
	{
		flag2=1;
		right.num.pop_front();
	}
	if((flag1==1&&flag2==0)||(flag1==0&&flag2==1))
	sign=1;
	len1=left.num.size();
	len2=right.num.size();
	if(len1<len2)
	{
		ans.num.push_front('0');
		temp=right;
		return ans;
	}
	else
	{
		for(iter=left.num.begin(),i=0;i<len2;++i,++iter)
		{
			temp.num.push_back(*iter);
		}
		InterCalc digit,res;
		for(j=0;j<10;++j)
		{
			digit.num.clear();
			digit.num.push_back(j+'0');
			res=right*digit;
			res=temp-res;
			if(*(res.num.begin())=='-')
				break;	
		}
		j-=1;
		if(j>0)
		{
			digit.num.clear();
			digit.num.push_back(j+'0');
			res=right*digit;//后添加的 
			temp=temp-res;//原来是+ 
			ans.num.push_back(j+'0');
		}
		for( ;iter!=left.num.end();++iter)
		{
			temp.num.push_back(*iter);
			for(j=0;j<10;++j)
			{
				digit.num.clear();
				digit.num.push_back(j+'0');
				res=right*digit;
				res=temp-res;
				if(*(res.num.begin())=='-')
					break;
			}
			j-=1;
			digit.num.clear();
			digit.num.push_back(j+'0');
			res=right*digit;
			temp=temp-res;
			ans.num.push_back(j+'0');
		}
		if(sign)
		{
			temp.num.push_front('-');
			ans.num.push_front('-');
		} 
	 } 
	 //ans 是商  temp是余数 
	 //ans.Print();
	//temp.Prin
	//不明原因多个零待解注意 
	while(*temp.num.begin()=='0')
	temp.num.pop_front();
	return temp;
}
const InterCalc& InterCalc::operator*=( const InterCalc& Right ) 
{
	return (*this)=(*this)*Right;
}
const InterCalc& InterCalc::operator/=( const InterCalc& Right )
{
	return (*this)=(*this)/Right;
}

/************************************************************************************** 
*类名称:FloatCalc
*类描述:大浮点数计算
*类功能:+,-,>,<,=,>=,<=,==,*,/,*=,/=,+=,-=,++,--和正负号;	 		
*类参考:自己根据大整数计算开发大浮点数计算开发中 ······	
*编写人:十二年 710055071
*编写时间:2015-03-31至2015-03-31  
***************************************************************************************/

class FloatCalc{
	InterCalc	zs;//整数部分
	InterCalc	xs;//小数部分 
	//int 	  flag;//0为正数  1为负数 
	static int dn;//输出小数的位数 默认10位
	friend void xsbuwei(FloatCalc& Left,FloatCalc& Right);  
public:
	FloatCalc(){}
	FloatCalc(const string& input);
	FloatCalc(const InterCalc& input);
	FloatCalc(const FloatCalc& input);

	void Print() const;//可以重载输出操作符 和输入操作符来优化输入输出 用cout cin 
	bool iszero() const;
	static void SetPrecision( const int& dn)							//设置浮点数输出精度 
	{
		FloatCalc::dn=dn;	
	}
	static void RePrecision()										//恢复浮点数默认精度 
	{
		FloatCalc::dn=10;
	}
	static int GetPrecision()										//输出浮点数精度 
	{
		return FloatCalc::dn;
	}
	bool operator>( const FloatCalc& Right ) const;			  //大于操作符 
	bool operator<( const FloatCalc& Right ) const;			  //小于操作符 
	bool operator>=(const FloatCalc& Right ) const;			  //大于等于操作符 
	bool operator<=(const FloatCalc& Right ) const;			  //小于等于操作符 
	bool operator==(const FloatCalc& Right ) const;			  //判断数值是否相等 
	const FloatCalc& operator+() const;					 	  //
	const FloatCalc& operator-();							  //
	const FloatCalc& operator++();							  //前置操作	 
	const FloatCalc operator++(int);					 	  //后置操作 
	const FloatCalc& operator--();							  // 
	const FloatCalc operator--(int);						  //
	
	const FloatCalc operator+( const FloatCalc& Right ) const;//加法运算 
	const FloatCalc operator-( const FloatCalc& Right ) const;//除法运算 
	const FloatCalc operator*( const FloatCalc& Right ) const;//乘法运算 ?????有问题 
	//const FloatCalc operator/( const FloatCalc& Right ) const;//除法运算			 
	//实际上 有的是在函数内部进行了传值操作 
	const FloatCalc& operator= ( const FloatCalc& Right );	  //赋值操作符 
	const FloatCalc& operator+=( const FloatCalc& Right );	  // += 运算 
	const FloatCalc& operator-=( const FloatCalc& Right );	  // -= 运算 
	//const FloatCalc& operator*=( const FloatCalc& Right );	  // *= 运算 
	//const FloatCalc& operator/=( const FloatCalc& Right );	  // /= 运算 
};
int FloatCalc::dn=10;//定义静态成员 必须在类外部定义
 
void xsbuwei(FloatCalc& Left,FloatCalc& Right)
{
	int len1,len2;
	len1=Left.xs.num.size();
	len2=Right.xs.num.size();
	if( len1 >= len2 )
 	{	
 		for(int i=0 ; i<len1-len2 ; ++i )
 		Right.xs.num.push_back('0');
	 }
	 else
	 {
	 	for(int i=0 ; i<len2-len1 ; ++i)
	 	Left.xs.num.push_back('0');
	 }
}
FloatCalc::FloatCalc(const string& input)
{		dn=10;
		int err=0,i=0,sign=0;
		if(input[0]=='+') ++i;
		if(input[0]=='-')
		{
			sign=1;
			++i;
		}
		while(input[i]=='0')
				++i; 
		for(; i<input.length() ; ++i )
		{
			if(input[i]!='.')
			{
				if(input[i] >= '0' && input[i] <= '9' )
				{
					zs.num.push_back( input[i] );
				}
				else
				{
					cout<<i+1<<"位输入数据有误"<<endl;
					err+=1; 	
				}
			}
			else
			{
				break;
			}
		}
		++i; 
		for(; i<input.length() ; ++i )
		{
				if(input[i] >= '0' && input[i] <= '9' )
				{
					xs.num.push_back( input[i] );
				}
				else
				{
					cout<<i+1<<"位输入数据有误"<<endl;
					err+=1; 	
				}
		
		} 
		if(sign)
			zs.num.push_front('-');
		if(err)
		{
		cout<<"一共有"<<err<<"处错误"<<endl;
		cout<<"请忽略结果重新输入数据"<<endl;
		zs.num.clear();
		xs.num.clear();
		//num.push_front('0');
		}	
}
FloatCalc::FloatCalc(const InterCalc& input)
{
	zs=input;
}
FloatCalc::FloatCalc(const FloatCalc& input)
{
	zs=input.zs;
	xs=input.xs;
}
void FloatCalc::Print() const
{	
	if(!(* this).iszero()&&(*zs.num.begin()=='-')&&zs.iszero())
	cout<<"-";
	zs.Print();
	cout<<".";
	if(xs.iszero())
	{
		for(int i=0;i<dn;++i)
		{
				cout<<0;
		}
	}
	else
	{
		list<char>::const_iterator iter=xs.num.begin();
		if(dn<xs.num.size())
		{
			for(int i=0;i<dn;++i)
			{
				cout<<*iter;	
			}
		}
		else
		{
			int i;
			for( i=0;iter!=xs.num.end();++iter,++i)
			{
				cout<<*iter;
			}
			for( ;i<dn;++i)
			{
				cout<<0;
			}
		}
	}
}
bool FloatCalc::iszero() const
{
	if(zs.iszero()&&xs.iszero())
	{
		return true;
	}
	else
	{
		return false;
	}
}
const FloatCalc& FloatCalc::operator= ( const FloatCalc& Right )
{
	zs=Right.zs;
	xs=Right.xs;
}
const FloatCalc& FloatCalc::operator+() const
{
	return *this;
}
const FloatCalc& FloatCalc::operator-()
{
	zs=-zs;
	return *this; 
}
const FloatCalc& FloatCalc::operator++()
{
	++zs;
	return *this;
}
const FloatCalc FloatCalc::operator++(int)
{
	FloatCalc ans(*this);
	++zs;
	return ans;
}
const FloatCalc& FloatCalc::operator--()
{
	--zs;
	return *this;
}
const FloatCalc FloatCalc::operator--(int)
{
	FloatCalc ans(*this);
	--zs;
	return ans;
}
bool FloatCalc::operator==(const FloatCalc& Right ) const
{
	return zs==Right.zs&&xs==Right.xs?true:false;
}
bool FloatCalc::operator>( const FloatCalc& Right ) const
{
		FloatCalc left(*this),right(Right);
		xsbuwei(left,right); 
		if(left.zs==Right.zs)
		{
			if(*left.zs.num.begin()=='-'&&*right.zs.num.begin()=='-')
			{
				return left.xs>=right.xs?false:true;
			}
			else if(*left.zs.num.begin()=='-'&&*right.zs.num.begin()!='-')
			{
				return false;
			}
			else if(*left.zs.num.begin()!='-'&&*right.zs.num.begin()=='-')
			{
				return true;
			}
			else 
			{
				return left.xs>right.xs?true:false;
			}
		}
		else if(left.zs>right.zs)
		{
			return true;
		}
		else
		{
			return false;
		}
}
bool FloatCalc::operator<( const FloatCalc& Right ) const
{	
	FloatCalc left(*this),right(Right);
	xsbuwei(left,right); 
	if(left.zs==right.zs)
		{
			if(*left.zs.num.begin()=='-'&&*right.zs.num.begin()=='-')
			{
				return left.xs>right.xs?true:false;
			}
			else if(*left.zs.num.begin()=='-'&&*right.zs.num.begin()!='-')
			{
				return true;
			}
			else if(*left.zs.num.begin()!='-'&&*right.zs.num.begin()=='-')
			{
				return false;
			}
			else 
			{
				return left.xs>=right.xs?false:true;
			}
		}
		else if(left.zs>right.zs)
		{
			return false;
		}
		else
		{
			return true;
		}
} 
bool FloatCalc::operator>=(const FloatCalc& Right ) const
{

		FloatCalc left(*this),right(Right);
		xsbuwei(left,right); 
		if(left.zs==Right.zs)
		{
			if(*left.zs.num.begin()=='-'&&*right.zs.num.begin()=='-')
			{
				return left.xs>right.xs?false:true;
			}
			else if(*left.zs.num.begin()=='-'&&*right.zs.num.begin()!='-')
			{
				return false;
			}
			else if(*left.zs.num.begin()!='-'&&*right.zs.num.begin()=='-')
			{
				return true;
			}
			else 
			{
				return left.xs>=right.xs?true:false;
			}
		}
		else if(left.zs>right.zs)
		{
			return true;
		}
		else
		{
			return false;
		}
}
bool FloatCalc::operator<=(const FloatCalc& Right ) const
{
	FloatCalc left(*this),right(Right);
	xsbuwei(left,right); 
	if(left.zs==right.zs)
		{
			if(*left.zs.num.begin()=='-'&&*right.zs.num.begin()=='-')
			{
				return left.xs>=right.xs?true:false;
			}
			else if(*left.zs.num.begin()=='-'&&*right.zs.num.begin()!='-')
			{
				return true;
			}
			else if(*left.zs.num.begin()!='-'&&*right.zs.num.begin()=='-')
			{
				return false;
			}
			else 
			{
				return left.xs>right.xs?false:true;
			}
		}
		else if(left.zs>right.zs)
		{
			return false;
		}
		else
		{
			return true;
		}
}
const FloatCalc FloatCalc::operator+( const FloatCalc& Right ) const
{
	FloatCalc left(*this),right(Right);
	xsbuwei(left,right);
	int len=left.xs.num.size();
	int flag=0;
	FloatCalc ans;
	if(*left.zs.num.begin()=='-'&&*right.zs.num.begin()=='-')
	{
		left.zs=-left.zs;
		right.zs=-right.zs;
		ans=left+right;
		flag=1;
	}
	else if(*left.zs.num.begin()!='-'&&*right.zs.num.begin()=='-')
	{
		right.zs.num.pop_front();
		ans=right-left;
	}
	else if(*left.zs.num.begin()=='-'&&*right.zs.num.begin()!='-')
	{
		left.zs.num.pop_front();
		ans=right-left;
	}
	else
	{
		ans.zs=left.zs+right.zs;
		ans.xs=left.xs+right.xs;
		if(ans.xs.num.size()>len)
		{
			ans.xs.num.pop_front();
			ans.zs+=1;	
		}	
	}
	if(flag)
	ans.zs.num.push_front('-');
	return ans;
} 
const FloatCalc FloatCalc::operator-( const FloatCalc& Right ) const
{
	FloatCalc left(*this),right(Right);
	xsbuwei(left,right);
	int len=left.xs.num.size();
	int flag=0;
	FloatCalc ans;
	if(*left.zs.num.begin()=='-'&&*right.zs.num.begin()=='-')
	{
		left.zs=-left.zs;
		right.zs=-right.zs;
		ans=right-left;
	}
	else if(*left.zs.num.begin()!='-'&&*right.zs.num.begin()=='-')
	{
		right.zs.num.pop_front();
		ans=left+right;
	}
	else if(*left.zs.num.begin()=='-'&&*right.zs.num.begin()!='-')
	{
		left.zs.num.pop_front();
		ans=left+right;
		ans.zs.num.push_front('-'); 
	}
	else
	{
		if(left>right)
		{
			if(left.xs>=right.xs)
			{
				ans.zs=left.zs-right.zs;
				ans.xs=left.xs-right.xs;
			}
			else
			{
				left.xs+=10;
				ans.xs=left.xs-right.xs;
				ans.zs=left.zs-right.zs-1;
			}
		}
		else
		{
			if(right.xs>=left.xs)
			{
				ans.zs=right.zs-left.zs;
				ans.xs=right.xs-left.xs;
				ans.zs.num.push_front('-');
			}
			else
			{
				right.xs+=10;
				ans.xs=right.xs-left.xs;
				ans.zs=right.zs-left.zs-1;
				ans.zs.num.push_front('-');
			}
		}
	}
	return ans;
}
const FloatCalc& FloatCalc::operator+=( const FloatCalc& Right )
{
	return *this=*this+Right; 
}
const FloatCalc& FloatCalc::operator-=( const FloatCalc& Right )
{
	return *this=*this-Right;
}
const FloatCalc FloatCalc::operator*( const FloatCalc& Right ) const// 0开头的数有问题 
{
	FloatCalc ans;
/*	FloatCalc left(*this), right(Right);
	xsbuwei(left,right);
	int len=left.xs.num.size();
	InterCalc sum;
	int x=pow(10,len);
	int y=pow(x,2);
	int flag=0;
	if(*left.zs.num.begin()=='-'&&*right.zs.num.begin()=='-')
	{
		left.zs.num.pop_front();
		right.zs.num.pop_front();
		sum=(left.zs*x+left.xs)*(right.zs*x+right.xs);
		ans.zs=sum/y;
		ans.xs=sum%y;
	}
	else if(*left.zs.num.begin()!='-'&&*right.zs.num.begin()=='-')
	{
		right.zs.num.pop_front();
		flag=1;
		sum=(left.zs*x+left.xs)*(right.zs*x+right.xs);
		ans.zs=sum/y;
		ans.xs=sum%y;
	}
	else if(*left.zs.num.begin()=='-'&&*right.zs.num.begin()!='-')
	{
		left.zs.num.pop_front();
		flag=1;
		sum=(left.zs*x+left.xs)*(right.zs*x+right.xs);
		ans.zs=sum/y;
		ans.xs=sum%y;
	}
	else
	{
		sum=(left.zs*x+left.xs)*(right.zs*x+right.xs);
		ans.zs=sum/y;
		ans.xs=sum%y;
	}
	if(flag)
		ans.zs.num.push_front('-');*/
	return ans;
}
/ 

int main()
{	
	while(1)
	{
		string str1,str2;
		cin>>str1;
		cin>>str2;
		InterCalc a(str1),b(str2);
		//FloatCalc a(str1),b(str2);
		//a.Print();
		(a+b).Print();
		cout<<endl;

	}
		return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊猫Devin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值