本文提供大整数的运算,包含加减乘,次方,阶乘的运算。
基本算法:
大整数运算的基本算法比较简单,很多书上都有介绍,本文有一点要说明,本文采用的是万进制来运算。为什么采用万进制?因为万进制一个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