#include "BigNum.h"
#include <math.h>
//Download by http://www.codefans.net
CBigNumber::CBigNumber()
{
number=0;
exponent=0;
};
CBigNumber::CBigNumber(float num)
{
number=num;
exponent=0;
Convert();
};
CBigNumber::CBigNumber(float num,int exp)
{
number=num;
exponent=exp;
Convert();
};
void CBigNumber::Convert()
{
if(number==0) return;
while(fabs(number)>=10)
{
number/=10;
exponent+=1;
}
while(fabs(number)<1)
{
number*=10;
exponent-=1;
}
};
CBigNumber CBigNumber::operator+(const CBigNumber& b)
{
CBigNumber result;
int multiple;
multiple=exponent-b.exponent;
if(multiple>0)
{
result.number=number+b.number*pow(10,-multiple);
result.exponent=exponent;
}
else
{
result.number=number*pow(10,multiple)+b.number;
result.exponent=b.exponent;
}
result.Convert();
return result;
};
CBigNumber CBigNumber::operator-(const CBigNumber& b)
{
CBigNumber result;
int multiple;
multiple=exponent-b.exponent;
if(multiple>0)
{
result.number=number-b.number*pow(10,-multiple);
result.exponent=exponent;
}
else
{
result.number=number*pow(10,multiple)-b.number;
result.exponent=b.exponent;
}
result.Convert();
return result;
};
CBigNumber CBigNumber::operator*(const CBigNumber& b)
{
CBigNumber result;
result.number=number*b.number;
result.exponent=exponent+b.exponent;
result.Convert();
return result;
};
CBigNumber CBigNumber::operator/(const CBigNumber& b)
{
CBigNumber result;
if (b.number==0) return 0;
result.number=number/b.number;
result.exponent=exponent-b.exponent;
result.Convert();
return result;
};
CBigNumber CBigNumber::operator=(const CBigNumber& b)
{
number=b.number;
exponent=b.exponent;
return *this;
};
double CBigNumber::GetNumber()
{
return number;
};
int CBigNumber::GetExp()
{
return exponent;
};
/*******************************************************************
* 大数运算类(支持大数的加减乘除和赋值运算) *
* by czlin(Xi'an JiaoTong University) *
* email:czlin@hkem.com *
* 你可以自由复制和传播该程序,但请保留上述说明 *
*******************************************************************
* *
* 1. 实现原理: *
* 任何一个数都可以表示成指数形式,如下所示: *
* N=nEe (0=<n的绝对值<=1,e为10的指数幂) *
* 例如100可以表示成1E2,1001可以表示成1.01E3 *
* 类 CBigNumber的成员number为上述的n,exponent为上述的e *
* 2. 如何使用这个类: *
* 你可以把CBigNumber的头文件和实现函数加入你的工程,然后定义 *
* 该类的实例,就可以对这些实例进行加减乘除了(详见示例程序) *
*******************************************************************/
class CBigNumber
{
private:
double number; //数部
int exponent; //指数部分
private:
void Convert(); //将该数转化成标准形式(0<=数部的绝对值<=1)
public:
CBigNumber();
CBigNumber(float num);
CBigNumber(float num,int exp);
CBigNumber operator+(const CBigNumber& b);
CBigNumber operator-(const CBigNumber& b);
CBigNumber operator*(const CBigNumber& b);
CBigNumber operator/(const CBigNumber& b);
CBigNumber operator=(const CBigNumber& b);
double GetNumber(); //取得该数的数部
int GetExp(); //取得该数的指数部分
};