`
phinecos
  • 浏览: 342665 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一个大数运算类

 
阅读更多

<!--<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);
friend
booloperator==(constdecnum&x,constdecnum&y);
friend
booloperator!=(constdecnum&x,constdecnum&y);
friend
booloperator>(constdecnum&x,constdecnum&y);
friend
booloperator<(constdecnum&x,constdecnum&y);
friend
booloperator>=(constdecnum&x,constdecnum&y);
friend
booloperator<=(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);
decnum
operator+(constdecnum&x)const;
decnum
operator-(constdecnum&x)const;
decnum
operator*(constdecnum&x)const;
decnum
operator/(constdecnum&x)const;
decnum
operator%(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语言大数运算库

    大数运算 RSA c语言大数运算库 英文PDf 中文PDF 源码

    大数运算的类

    C++中大数运算的类

    大数运算类(C++实现)(代码注释详细,运行main.cpp就行,内含有可直接执行的exe文件)

    本大数运算包括加减乘除、取余、求幂,是用列表数据结构来实现的大数运算类,理论上可以适用于无限长度的大数,正负数+-*/%均适用。该资源可能仅适用于大学生c++或者数据结构结课的大型实验,内部每个函数和类的代码...

    大数运算和RSA加密算法

    大数运算和RSA加密算法

    一个大数运算的JS库

    一个大数运算的JS库,用于加解密时的大数运算,或者其它的一些用途。

    毕设论文基于大数运算的算术编码实现

    算术编码是无损数据压缩中熵编码的一种实现方式,其将整个消息序列编码成一个数字。算术编码具有比Huffman编码更高的编码效率,在图像、视频压缩等领域具有广泛的应用前景。在算术编码的实际应用中,通常利用归一化...

    低效率大数运算类(内含大数加法和大数乘法).vbs

    低效率大数运算类

    C++ 大数运算类

    实现各种常用的运算法则,如+、-、*、/、%、++、--、+=、-=、*=、%=、/=、&gt;、&lt;、、&gt;=、==、!=等等 纯面向对象实现,基本上可以代替系统int型使用。

    大数运算类(支持大数的加减乘除和赋值运算)

    大数运算类(支持大数的加减乘除和赋值运算) 1. 实现原理: * * 任何一个数都可以表示成指数形式,如下所示: * * N=nEe (0=的绝对值,e为10的指数幂) * * 例如100可以表示成1E2,1001可以表示成1.01E3 * * 类 ...

    miracl大数运算库

    MIRACL(Multiprecision Integer and RationalArithmetic C/c++ Library)是一套由Shamus Software Ltd.所开发的一套关于大数运算函数库,用来设计与大数运算相关的密码学之应用

    大数运算c++

    设计一个“大数类”(LargeNumber),使它支持对任意大整数的输入、输出和基本运算(+,-,×,÷,=,++,--,^)。 1. “大数”能以字符串的方式存储在文件中,并能将其读入内存,实现字符与数值的转化,...

    Java编写的大数运算

    自己花了两个月时间编写的大数运算。编程语言:java。其中成功运用了 类 的特性。调试成功,提供分享!

    C++大数运算 支持浮点运算

    用C++写的大数运算,包含加、减、乘、除,函数名分别为BigAdd,BigMinus,BigMulti,BigDivid

    gmp大数运算库

    最新的大数运算库GMP的源代码,这个运算库是目前最快的大数运算库

    最大公因数 大数运算类.rar

    Mov,赋值运算,可赋值为大数或普通整数,可重载为运算符“=” Cmp,比较运算,可重载为运算符“==”、“!=”、“&gt;=”、“”等 Add,加,求大数与大数或大数与普通整数的和,可重载为运算符“+” Sub,减,求大数...

    带大数运算库的rsa算法

    包括了一个大数运算库,md5,des和rsa算法,有demo

    c++大数运算的基本思路

    C++大数运算的基本思路,可帮助更快的设计程序。

    C语言 大数运算(无限大小)头文件

    C语言 大数运算(无限大小)头文件 支持 + , - , * , / , % ,&gt; , ,&gt;=,,==.流输入&gt;&gt;,流输出&lt;&lt;.

Global site tag (gtag.js) - Google Analytics