一个大整数运算类源码(BigInt)

 

本文提供大整数的运算,包含加减乘,次方,阶乘的运算。

基本算法:

        大整数运算的基本算法比较简单,很多书上都有介绍,本文有一点要说明,本文采用的是万进制来运算。为什么采用万进制?因为万进制一个int字长可容纳4数字,这样就减少存储空间,同时大大提高了运算速度。照此说法还不如采用亿进制,原因在于乘法运算的过程中需要用到两个数相乘,而两个小于一万的数相乘小于一亿,也小于21亿,符合一个int字长,而采用亿进制会造成越界,处理起来麻烦,费时。

        次方运算采用了优化算法,实际上采用的是将指数化成二进制,然后拆开运算后相加得到结果。

        阶乘运算基本未使用优化策略,采用传统的递推算法。

代码:

 //
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
class BigInt
{
private:
    int sign;
    int nb;
    int *pData;
    void Init(int nnb);
    void ShowData(int m);
public:
    BigInt();
    BigInt(BigInt &bnum);
    BigInt(int num);
    ~BigInt();
    void Show();//控制台显示
    void trim();//规范化
    BigInt &operator=(int num);
    BigInt &operator=(BigInt &bnum);
    int operator==(BigInt &bnum);
    int operator!=(BigInt &bnum);
    int operator>(BigInt &bnum);
    int operator<(BigInt &bnum);
    int operator>=(BigInt &bnum);
    int operator<=(BigInt &bnum);
    BigInt &operator+=(BigInt &bnum);
    BigInt &operator-=(BigInt &bnum);
    BigInt &operator*=(BigInt &bnum);
    int GetBit();//获取位数
    int GetSign();//获取符号
    void Cont();//相反数
    int ReadFromStr(char *str);//数字字符串转换为BigInt
    int WriteToStr(char *str);//转变为字符串
    friend BigInt operator-(BigInt &bnum);
};
BigInt::BigInt()
{
    sign=0;
    nb=1;
    pData=new int[nb];
    pData[0]=0;
}
BigInt::BigInt(BigInt &bnum)
{
    sign=bnum.sign;
    nb=bnum.nb;
    pData=new int[nb];
    for(int i=0;i<nb;i++)
    pData[i]=bnum.pData[i];
}
BigInt::BigInt(int num)
{
    *this=num;
}
BigInt::~BigInt()
{
    delete []pData;
}
void BigInt::Init(int nnb)
{
    delete []pData;
    nb=nnb;
    pData=new int[nb];
    for(int i=0;i<nb;i++)
    pData[i]=0;
}
void BigInt::ShowData(int m)
{
    printf("%c%c%c%c",pData[m]/1000+'0',(pData[m]%1000)/100+'0',(pData[m]%100)/10+'0',pData[m]%10+'0');
}
void BigInt::Show()//控制台显示
{
    int i;
    if(sign==-1)
    printf("-");
    for(i=nb-1;i>=0;i--)
    {
        ShowData(i);
    }
}
void BigInt::trim()//规范化
{
    int i,j;
    for(i=nb-1;i>0;i--)
    {
        if(pData[i]!=0)
        break;
    }
    if(i==nb-1)
    return;
    BigInt bnum=*this;
    Init(i+1);
    for(j=0;j<=i;j++)
    {
        pData[j]=bnum.pData[j];
    }
}
BigInt &BigInt::operator=(int num)
{
    int n=abs(num);
    if(num==0)
    sign=0;
    else if(num>0)
    sign=1;
    else
    sign=-1;
    if(n<10000)
    {
        Init(1);
        pData[0]=n;
    }
    else if(n<100000000)
    {
        Init(2);
        pData[1]=n/10000;
        pData[0]=n%10000;
    }
    else
    {
        Init(3);
        pDat

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值