⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 大数运算类.txt

📁 1. 实现原理: * 任何一个数都可以表示成指数形式
💻 TXT
字号:
  大数运算类

   
 // BigNum.h
/*******************************************************************
*                 大数运算类(支持大数的加减乘除和赋值运算)        *
*    你可以自由复制和传播该程序,但请保留上述说明               *
*******************************************************************                     
*                                                                 *
* 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();           //取得该数的指数部分
};

// BigNum.cpp
#include "BigNum.h"
#include <math.h>

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;
};

 
/**************************************
*示例程序:计算1000的阶乘
**************************************/

#include "BigNum.h"
#include <stdio.h>

void main()
{
  CBigNumber a(1000);   //大数形式的1000
  CBigNumber b(1);      //大数形式的1
  CBigNumber result(1); //运算结果,初值为1
  int i;
  for(i=1000;i>=1;i--)
  {
    result=result*a;
    a=a-b;             //减1
  }

  printf("%fE%d",result.GetNumber(),result.GetExp());
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -