<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include<stdio.h>
#include<math.h>
#include<iostream>
usingnamespacestd;
classdecnum
{
frienddecnumpow(constdecnum&x,intn);
frienddecnumroot(constdecnum&x,intn);
frienddecnumdiv(constdecnum&x,constdecnum&y,decnum&r);
frienddecnumabs(constdecnum&x);
friendbooloperator==(constdecnum&x,constdecnum&y);
friendbooloperator!=(constdecnum&x,constdecnum&y);
friendbooloperator>(constdecnum&x,constdecnum&y);
friendbooloperator<(constdecnum&x,constdecnum&y);
friendbooloperator>=(constdecnum&x,constdecnum&y);
friendbooloperator<=(constdecnum&x,constdecnum&y);
friendostream&operator<<(ostream&os,constdecnum&x);
public:
decnum():cap(0),num(0),sign(0),val(NULL){}
decnum(constchar*v,intn)
{
inti,j,k;
val=newchar[n];
if(v[0]=='-')
{
sign=1;
v++;
n--;
}
else
{
sign=0;
if(v[0]=='+')
v++;
}
for(i=0;i<n&&v[i]=='0';i++);
for(j=0,k=n-1;k>=i;--k,++j)
{
if(v[k]>='0'&&v[k]<='9')
{
val[j]=v[k]-'0';
}
else
break;
}
num=j;
cap=n;
}
decnum(constdecnum&x)
{
val=newchar[x.num];
memcpy(val,x.val,x.num);
sign=x.sign;
num=x.num;
cap=x.num;
}
decnum(intx)
{
if(x==0)
{
cap=num=0;
val=NULL;
return;
}
if(x<0)
{
sign=1;
x=-x;
}
else
sign=0;
chartemp[20];
sprintf(temp,"%d",x);
intn=strlen(temp);
num=cap=n;
val=newchar[n];
for(inti=0;i<n;i++)
val[i]=temp[n-1-i]-'0';
}
decnum(longlongx)
{
if(x==0)
{
cap=num=0;
val=NULL;
return;
}
if(x<0)
{
sign=1;
x=-x;
}
else
sign=0;
chartemp[20];
sprintf(temp,"%lld",x);
intn=strlen(temp);
num=cap=n;
val=newchar[n];
for(inti=0;i<n;i++)
val[i]=temp[n-1-i]-'0';
}
~decnum(){delete[]val;}
intsize()const{returnnum;}
decnum&operator=(constdecnum&x)
{
if(this!=&x)
{
if(cap<x.num)
{
delete[]val;
val=newchar[x.num];
cap=x.num;
}
memcpy(val,x.val,x.num);
num=x.num;
sign=x.sign;
}
return*this;
}
decnum&operator=(intx)
{
*this=decnum(x);
return*this;
}
decnum&operator=(longlongx)
{
*this=decnum(x);
return*this;
}
decnum&abs()
{
sign=0;
return*this;
}
decnum&operator+=(constdecnum&x);
decnum&operator-=(constdecnum&x);
decnum&operator*=(constdecnum&x);
decnum&operator/=(constdecnum&x);
decnum&operator%=(constdecnum&x);
decnumoperator+(constdecnum&x)const;
decnumoperator-(constdecnum&x)const;
decnumoperator*(constdecnum&x)const;
decnumoperator/(constdecnum&x)const;
decnumoperator%(constdecnum&x)const;
boolispow(intn,decnum&r)const;
boolispow()const;
private:
intcap;
intnum;
intsign;
char*val;
private:
charroot_1(intn);
decnum&absadd(constdecnum&x);
decnum&abssub(constdecnum&x);
boolabsge(constdecnum&x);
};
实现代码
大数类实现代码
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include"decnum.h"
decnum&decnum::absadd(constdecnum&x)
{
inti,max;
charcarry=0,ch;
if(x.num==0)return*this;
if(num<x.num)
max=x.num+1;
else
max=num+1;
if(max>cap)
{
cap=max;
char*newval=newchar[cap];
memcpy(newval,val,num);
memset(newval+num,0,cap-num);
delete[]val;
val=newval;
}
else
{
memset(val+num,0,max-num);
}
num=max-1;
for(i=0;i<x.num;i++)
{
ch=val[i]+x.val[i]+carry;
if(ch>9)
{
carry=1;
val[i]=ch-10;
}
else
{
carry=0;
val[i]=ch;
}
}
for(;i<=num&&carry==1;i++)
{
ch=val[i]+1;
if(ch>9)
{
carry=1;
val[i]=ch-10;
}
else
{
carry=0;
val[i]=ch;
}
}
if(i>num)num=i;
return*this;
}
decnum&decnum::abssub(constdecnum&x)
{
if(x.num==0)return*this;
inti;
charcarry=0,ch;
for(i=0;i<x.num;i++)
{
ch=val[i]-x.val[i]-carry;
if(ch<0)
{
carry=1;
val[i]=ch+10;
}
else
{
carry=0;
val[i]=ch;
}
}
for(;i<num&&carry==1;i++)
{
ch=val[i]-1;
if(ch<0)
{
carry=1;
val[i]=ch+10;
}
else
{
carry=0;
val[i]=ch;
}
}
for(i=num;i>0&&val[i-1]==0;i--);
num=i;
return*this;
}
booldecnum::absge(constdecnum&x)
{
if(num>x.num)returntrue;
if(num<x.num)returnfalse;
for(inti=num-1;i>=0;i--)
{
if(val[i]>x.val[i])
returntrue;
elseif(val[i]<x.val[i])
returnfalse;
}
returntrue;
}
decnum&decnum::operator+=(constdecnum&x)
{
if(x.sign==sign)
returnabsadd(x);
elseif(absge(x))
returnabssub(x);
else
{
decnumtmp(*this);
*this=x;
returnabssub(tmp);
}
}
decnum&decnum::operator-=(constdecnum&x)
{
if(x.sign!=sign)
returnabsadd(x);
elseif(absge(x))
returnabssub(x);
else
{
decnumtmp(*this);
*this=x;
returnabssub(tmp);
}
}
decnum&decnum::operator*=(constdecnum&x)
{
if(num==0)return*this;
if(x.num==0)
{
num=0;
return*this;
}
if(sign==x.sign)
sign=0;
else
sign=1;
intmul,i,n,newcap,max;
charch,carry;
char*newval=newchar[num+x.num];
newcap=num+x.num;
memset(newval,0,num+x.num);
decnuma,b;
char*ptr;
for(i=0;i<num&&val[i]==0;i++);
intna=i;
a.val=val+i;
a.num=num-i;
for(i=0;i<num&&x.val[i]==0;i++);
intnb=i;
b.val=x.val+i;
b.num=x.num-i;
ptr=newval+na+nb;
for(n=0;n<=a.num+b.num-2;n++)
{
mul=0;
if(n>b.num-1)
i=n-b.num+1;
else
i=0;
max=n<a.num-1?n:a.num-1;
for(;i<=max;i++)
mul+=a.val[i]*b.val[n-i];
carry=0;
for(i=n;mul>0||carry>0;mul/=10,i++)
{
ch=ptr[i]+mul%10+carry;
if(ch>9)
{
carry=1;
ptr[i]=ch-10;
}
else
{
carry=0;
ptr[i]=ch;
}
}
}
for(i=a.num+b.num;i>0&&ptr[i-1]==0;i--);
num=i+na+nb;
if(cap>=num)
{
memcpy(val,newval,num);
delete[]newval;
}
else
{
cap=newcap;
delete[]val;
val=newval;
}
a.val=b.val=NULL;
return*this;
}
decnum&decnum::operator/=(constdecnum&x)
{
charch,carry,fac;
decnumtmp;
inti;
if(x.num==0)return*this;
if(num<x.num)
{
num=0;
return*this;
}
if(sign==x.sign)
sign=0;
else
sign=1;
char*newval=newchar[num-x.num+1];
memset(newval,0,num-x.num+1);
carry=0;
fac=x.val[x.num-1]+1;
tmp.val=val+num-x.num+1;
tmp.cap=tmp.num=x.num-1;
for(i=num-1;i>=x.num-1;i--)
{
tmp.val--;
tmp.num++;
ch=(carry*10+val[i])/fac;
tmp-=x*ch;
while(tmp>=x)
{
tmp-=x;
ch++;
}
newval[i-x.num+1]=ch;
carry=val[i];
}
tmp.val=NULL;
for(i=num-x.num+1;i>0&&newval[i-1]==0;i--);
num=i;
delete[]val;
val=newval;
return*this;
}
decnum&decnum::operator%=(constdecnum&x)
{
charch,carry,fac;
decnumtmp;
inti;
if(x.num==0)return*this;
if(num<x.num)return*this;
carry=0;
fac=x.val[x.num-1]+1;
tmp.val=val+num-x.num+1;
tmp.num=x.num-1;
for(i=num-1;i>=x.num-1;i--)
{
tmp.val--;
tmp.num++;
ch=(carry*10+val[i])/fac;
tmp-=x*ch;
while(tmp>=x)
{
tmp-=x;
ch++;
}
carry=val[i];
}
tmp.val=NULL;
num=tmp.num;
return*this;
}
decnumdecnum::operator+(constdecnum&x)const
{
decnumtmp=*this;
returntmp+=x;
}
decnumdecnum::operator-(constdecnum&x)const
{
decnumtmp=*this;
returntmp-=x;
}
decnumdecnum::operator*(constdecnum&x)const
{
decnumtmp=*this;
returntmp*=x;
}
decnumdecnum::operator/(constdecnum&x)const
{
decnumtmp=*this;
returntmp/=x;
}
decnumdecnum::operator%(constdecnum&x)const
{
decnumtmp=*this;
returntmp%=x;
}
decnumabs(constdecnum&x)
{
decnumtmp(x);
tmp.sign=0;
returntmp;
}
decnumpow(constdecnum&x,intn)
{
decnumtmp(1),fac(x);
for(;n>0;n>>=1)
{
if(n&0x01)
tmp*=fac;
fac*=fac;
}
returntmp;
}
chardecnum::root_1(intn)
{
charr=(int)(pow(1+val[num-1],1.0/n)*pow(10,(num-1.0)/n));
for(;r>0&&pow(decnum(r),n)>*this;r--);
returnr;
}
booldecnum::ispow(intn,decnum&r)const
{
if(num==0)
{
r.num=0;
returntrue;
}
if(sign==1&&(n&1==0))
{
r.num=0;
returnfalse;
}
decnumtmp,p;
r.cap=r.num=(num+n-1)/n;
r.val=newchar[r.num];
r.sign=sign;
memset(r.val,0,r.num);
tmp.val=val+(r.num-1)*n;
tmp.num=num-(r.num-1)*n;
r.val[r.num-1]=tmp.root_1(n);
tmp.val=newchar[r.num+1];
tmp.cap=r.num+1;
intv;
p=pow(r,n);
if(p==*this)returntrue;
for(inti=r.num-2;i>=0;i--)
{
memset(tmp.val,0,i+1);
tmp.val[i]=1;
tmp.num=i+1;
tmp+=r;
p=(*this-p)/(pow(tmp,n)-p);
if(p.num>1)
v=9;
elseif(p.num>0)
v=p.val[0];
else
v=0;
for(;v>=0;v--)
{
r.val[i]=v;
p=pow(r,n);
if(p==*this)
returntrue;
if(p<*this)
break;
}
}
returnfalse;
}
booldecnum::ispow()const
{
decnumr,dec2("2",1);
if(ispow(2,r))returntrue;
for(intn=3;r>dec2;n+=2)
{
if(ispow(n,r))returntrue;
}
returnfalse;
}
decnumroot(constdecnum&x,intn)
{
decnumr;
x.ispow(n,r);
returnr;
}
decnumdiv(constdecnum&x,constdecnum&y,decnum&r)
{
charch,carry,fac;
decnumd=x,tmp;
inti;
if(y.num==0)returnx;
if(d.num<y.num)
{
r=x;
d=0;
returnd;
}
char*newval=newchar[d.num-y.num+1];
memset(newval,0,d.num-y.num+1);
carry=0;
fac=y.val[y.num-1]+1;
tmp.val=d.val+d.num-y.num+1;
tmp.num=y.num-1;
for(i=d.num-1;i>=y.num-1;i--)
{
tmp.val--;
tmp.num++;
ch=(carry*10+d.val[i])/fac;
tmp-=y*ch;
while(tmp>=y)
{
tmp-=y;
ch++;
}
newval[i-y.num+1]=ch;
carry=d.val[i];
}
r=tmp;
tmp.val=NULL;
for(i=d.num-y.num+1;i>0&&newval[i-1]==0;i--);
d.num=i;
delete[]d.val;
d.val=newval;
returnd;
}
booloperator==(constdecnum&x,constdecnum&y)
{
if(x.sign!=y.sign)returnfalse;
if(x.num!=y.num)returnfalse;
for(inti=0;i<x.num;i++)
{
if(x.val[i]!=y.val[i])
returnfalse;
}
returntrue;
}
booloperator!=(constdecnum&x,constdecnum&y)
{
return!(x==y);
}
booloperator>(constdecnum&x,constdecnum&y)
{
if(x.sign>y.sign)returnfalse;
if(x.sign<y.sign)returntrue;
boolretval=(x.sign==0);
if(x.num>y.num)returnretval;
if(x.num<y.num)return!retval;
for(inti=x.num-1;i>=0;i--)
{
if(x.val[i]>y.val[i])
returnretval;
elseif(x.val[i]<y.val[i])
return!retval;
}
returnfalse;
}
booloperator<(constdecnum&x,constdecnum&y)
{
returny>x;
}
booloperator>=(constdecnum&x,constdecnum&y)
{
if(x.sign>y.sign)returnfalse;
if(x.sign<y.sign)returntrue;
boolretval=(x.sign==0);
if(x.num>y.num)returnretval;
if(x.num<y.num)return!retval;
for(inti=x.num-1;i>=0;i--)
{
if(x.val[i]>y.val[i])
returnretval;
elseif(x.val[i]<y.val[i])
return!retval;
}
returntrue;
}
booloperator<=(constdecnum&x,constdecnum&y)
{
returny>=x;
}
ostream&operator<<(ostream&os,constdecnum&x)
{
if(x.size()==0)
os<<0;
else
{
if(x.sign==1)
os<<"-";
for(inti=x.size()-1;i>=0;i--)
os<<(int)x.val[i];
}
returnos;
}
测试代码:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include<iostream>
#include<string>
usingnamespacestd;
#include"decnum.h"
intmain()
{
decnumx,y,r;
stringline;
size_tn=0;
cout<<"inputx:"<<endl;
getline(cin,line);
x=decnum(line.c_str(),line.length());
cout<<"inputy:"<<endl;
getline(cin,line);
y=decnum(line.c_str(),line.length());
cout<<"x="<<x<<endl;
cout<<"y="<<y<<endl;
cout<<"x*y="<<x*y<<endl;
cout<<"x/y="<<x/y<<endl;
cout<<"x%y="<<x%y<<endl;
cout<<"div(x,y)="<<div(x,y,r)<<endl;
cout<<"mod(x,y)="<<r<<endl;
cout<<"y^2="<<pow(y,2)<<endl;
cout<<"x^1/2="<<root(x,2)<<endl;
cout<<"xispow="<<x.ispow()<<endl;
system("pause");
return0;
}
分享到:
相关推荐
该大数运算类是一个支持超高精度和超大数的基本运算类,最高精度能够达到一百亿位有效数字,最大能够表示10的2147483648次方,支持基础的四则运算和比较运算。该类的特点是使用指数形式表示数据,应此空间占用少,...
大数运算 RSA c语言大数运算库 英文PDf 中文PDF 源码
C++中大数运算的类
本大数运算包括加减乘除、取余、求幂,是用列表数据结构来实现的大数运算类,理论上可以适用于无限长度的大数,正负数+-*/%均适用。该资源可能仅适用于大学生c++或者数据结构结课的大型实验,内部每个函数和类的代码...
大数运算和RSA加密算法
一个大数运算的JS库,用于加解密时的大数运算,或者其它的一些用途。
算术编码是无损数据压缩中熵编码的一种实现方式,其将整个消息序列编码成一个数字。算术编码具有比Huffman编码更高的编码效率,在图像、视频压缩等领域具有广泛的应用前景。在算术编码的实际应用中,通常利用归一化...
低效率大数运算类
实现各种常用的运算法则,如+、-、*、/、%、++、--、+=、-=、*=、%=、/=、>、<、、>=、==、!=等等 纯面向对象实现,基本上可以代替系统int型使用。
大数运算类(支持大数的加减乘除和赋值运算) 1. 实现原理: * * 任何一个数都可以表示成指数形式,如下所示: * * N=nEe (0=的绝对值,e为10的指数幂) * * 例如100可以表示成1E2,1001可以表示成1.01E3 * * 类 ...
MIRACL(Multiprecision Integer and RationalArithmetic C/c++ Library)是一套由Shamus Software Ltd.所开发的一套关于大数运算函数库,用来设计与大数运算相关的密码学之应用
设计一个“大数类”(LargeNumber),使它支持对任意大整数的输入、输出和基本运算(+,-,×,÷,=,++,--,^)。 1. “大数”能以字符串的方式存储在文件中,并能将其读入内存,实现字符与数值的转化,...
自己花了两个月时间编写的大数运算。编程语言:java。其中成功运用了 类 的特性。调试成功,提供分享!
用C++写的大数运算,包含加、减、乘、除,函数名分别为BigAdd,BigMinus,BigMulti,BigDivid
最新的大数运算库GMP的源代码,这个运算库是目前最快的大数运算库
Mov,赋值运算,可赋值为大数或普通整数,可重载为运算符“=” Cmp,比较运算,可重载为运算符“==”、“!=”、“>=”、“”等 Add,加,求大数与大数或大数与普通整数的和,可重载为运算符“+” Sub,减,求大数...
包括了一个大数运算库,md5,des和rsa算法,有demo
C++大数运算的基本思路,可帮助更快的设计程序。
C语言 大数运算(无限大小)头文件 支持 + , - , * , / , % ,> , ,>=,,==.流输入>>,流输出<<.