大整数除法.docx
《大整数除法.docx》由会员分享,可在线阅读,更多相关《大整数除法.docx(15页珍藏版)》请在冰豆网上搜索。
![大整数除法.docx](https://file1.bdocx.com/fileroot1/2022-11/23/5b2a48aa-d4bd-4625-8f2d-d0311cd061be/5b2a48aa-d4bd-4625-8f2d-d0311cd061be1.gif)
大整数除法
大整数除法.txt我不奢望什么,只希望你以后的女人一个不如一个。
真怀念小时候啊,天热的时候我也可以像男人一样光膀子!
#include
#include
usingnamespacestd;
constintmaxsize=1000;
classCbigint
...{
private:
charm_int[maxsize];
intlength;
public:
Cbigint(char*p=NULL);
Cbigint(constCbigint&c);
Cbigint:
:
Cbigint(longn);
voidsinmult(intoffset,charstr1,constchar*str2,intn,char*dest);//一位乘法,供多位乘法调用
voidmult(constchar*str1,constchar*str2,intn1,intn2,char*dest);//乘法实现主程序
voidsub(constchar*str1,intn1,constchar*str2,intn2,char*dest);//减法实现主程序
voidsum(constchar*str1,intn1,constchar*str2,intn2,char*dest);//加法实现主程序
Cbigintabs()const;//返回绝对值
friendostream&operator<<(ostream&dirt,Cbigint&iv);//输出
friendistream&operator>>(istream&dirt,Cbigint&iv);//输入
CbigintCbigint:
:
operator=(Cbigintn);//重载等号
booloperator>(constCbigint&n);
booloperator<(constCbigint&n);
booloperator==(constCbigint&n);
Cbigintoperator-(constCbigint&n);
Cbigintoperator-(longn);
Cbigintoperator-()const;//重载负号
Cbigintoperator+(constCbigint&n);
Cbigintoperator+(longn);
Cbigintoperator*(longn);
Cbigintoperator*(constCbigint&n);
Cbigintoperator/(longn);
Cbigintoperator/(constCbigint&n);
stringtoString();//转化为字条串
voidinit(char*p);//用字串初始化
};
//bigint.cpp
#include"bigint.h"
Cbigint:
:
Cbigint(char*p)
...{
if(p==NULL)
...{
for(inti=1;im_int[i]=0;
m_int[0]='+';
length=1;
}
else
...{
length=strlen(p);
inti=0;
if(p[0]!
='-')
...{
for(i=1;i<=length;i++)
m_int[i]=p[i-1]-48;
m_int[0]='+';
}
else
...{
for(i=1;im_int[i]=p[i]-48;
m_int[0]='-';
length--;
}
for(i;i...{
m_int[i]=0;
}
}
}
Cbigint:
:
Cbigint(longn)
...{
longj=0,m=n;
while((m/10)!
=0)
...{
j++;
m=m/10;
}
length=j+1;
while((n/10)!
=0)
...{
m_int[j+1]=n%10;
j--;
n=n/10;
}
m_int[1]=n;
if(n>=0)
m_int[0]='+';
else
m_int[0]='-';
}
voidCbigint:
:
init(char*p)
...{
length=strlen(p);
inti=1;
if(p[0]!
='-')
...{
for(i=1;i<=length;i++)
m_int[i]=p[i-1]-48;
m_int[0]='+';
}
else
...{
for(i=1;i<=length;i++)
m_int[i]=p[i]-48;
m_int[0]='-';
length--;
}
for(i;im_int[i]=0;
}
Cbigint:
:
Cbigint(constCbigint&c)
...{
for(inti=0;i<=c.length;i++)
m_int[i]=c.m_int[i];
length=c.length;
}
stringCbigint:
:
toString()
{
stringstr(length+1,'\0');
if(m_int[0]=='+')
{
for(intj=0;jstr[j]=m_int[j+1]+48;
}
else
{
for(intj=1;j<=length;j++)
str[j]=m_int[j]+48;
str[0]='-';
}
returnstr;
}
voidCbigint:
:
sinmult(intoffset,charstr1,constchar*str2,intn,char*dest)//一位的整数str1(0-9)与str2相乘把结果把到dest的offset位上
{
intinc=0,i,x;
i=n-1;
while(i>=0)
{
x=str2[i]*str1+inc+dest[offset];
dest[offset]=x%10;
inc=x/10;
i--;
offset++;
}
while(inc)
{
x=dest[offset]+inc;
dest[offset]=x%10;
inc=x/10;
offset++;
}
}
voidCbigint:
:
mult(constchar*str1,constchar*str2,intn1,intn2,char*dest)
{
inti=n1-1;
while(i>=0)
{
sinmult(n1-i-1,str1[i],str2,n2,dest);
i--;
}
}
CbigintCbigint:
:
operator*(constCbigint&n)
{
Cbiginttemp;
chardest[maxsize]={0};
inti=0,j=0;
mult(m_int+1,n.m_int+1,length,n.length,dest);
for(i=maxsize-1;i>=0;i--)
if(dest[i]!
=0)
break;
temp.length=i+1;
for(j=0;j<=i;j++)
temp.m_int[j+1]=dest[i-j];
if(m_int[0]!
=n.m_int[0])
temp.m_int[0]='-';
else
temp.m_int[0]='+';
returntemp;
}
CbigintCbigint:
:
operator/(constCbigint&n)
{
Cbigintdiv1=abs(),div2=n.abs(),result;
intflag=0;
if(m_int[0]==n.m_int[0])
flag='+';
else
flag='-';
if(div1{
result.m_int[0]='+';
result.m_int[1]=0;
result.length=1;
returnresult;
}
result.m_int[0]=flag;
if(div1==div2)
{
result.m_int[0]=flag;
result.m_int[1]=1;
result.length=1;
returnresult;
}
intlen1=div1.length,len2=div2.length,len3,temp=0;
inti=1;
for(i=1;i<=len2;i++)
{
if(div1.m_int[i]>div2.m_int[i])
{
result.length=len1-len2+1;
break;
}
if(div1.m_int[i]{
result.length=len1-len2;
break;
}
}
if(i>len2)
result.length=len1-len2+1;
len3=result.length;
while(div1>div2||div1==div2)
{
for(i=1;i<=len2;i++)
{
if(div1.m_int[i]>div2.m_int[i])
{
temp=len1-len2+1;
break;
}
if(div1.m_int[i]{
temp=len1-len2;
break;
}
}
if(i>len2)
temp=len1-len2+1;
result.m_int[len3-temp+1]=result.m_int[len3-temp+1]+1;
div2.length=div2.length+temp-1;
div1=div1-div2;
div2.length=len2;
len1=div1.length;
}
returnresult;
}
CbigintCbigint:
:
operator/(longn)
{
return(*this)/Cbigint(n);
}
CbigintCbigint:
:
operator=(constCbigintn)
{
for(inti=0;i<=n.length;i++)
m_int[i]=n.m_int[i];
for(inti=n.length+1;i<=length;i++)
m_int[i]=0;
length=n.length;
returnn;
}
CbigintCbigint:
:
operator*(longn)
{
return(*this)*Cbigint(n);
}
CbigintCbigint:
:
operator+(longn)
{
return*this+Cbigint(n);
}
boolCbigint:
:
operator>(constCbigint&n)
{
if(m_int[0]>n.m_int[0])
returntrue;
if(m_int[0]returnfalse;
if(m_int[0]=='+')
{
if(length>n.length)
returntrue;
if(lengthreturnfalse;
for(inti=1;i<=length;i++)
{
if(m_int[i]>n.m_int[i])
returntrue;
if(m_int[i]returnfalse;
}
returnfalse;
}
else
{
if(length>n.length)
returnfalse;
if(lengthreturntrue;
for(inti=1;i<=length;i++)
{
if(m_int[i]>n.m_int[i])
returnfalse;
if(m_int[i]returntrue;
}
returnfalse;
}
}
boolCbigint:
:
operator==(constCbigint&n)
{
if(length!
=n.length)
returnfalse;
for(inti=0;i<=length;i++)
if(m_int[i]!
=n.m_int[i])
returnfalse;
returntrue;
}
boolCbigint:
:
operator<(constCbigint&n)
{
if(*this>n||*this==n)
returnfalse;
else
returntrue;
}
CbigintCbigint:
:
operator+(constCbigint&n)
{
Cbiginttemp;
chardest[maxsize]={0};
charflag='+';
inti=0;
if(m_int[0]==n.m_int[0])
{
flag=m_int[0];
if(*thissum(m_int+1,length,n.m_int+1,n.length,dest);
else
sum(n.m_int+1,n.length,m_int+1,length,dest);
}
else
{
if(abs()==n.abs())
{
temp.length=1;
temp.m_int[0]='+';
temp.m_int[1]=0;
returntemp;
}
if(abs()>n.abs())
{
flag=m_int[0];
sub(m_int+1,length,n.m_int+1,n.length,dest);
}
else
{
flag=n.m_int[0];
sub(n.m_int+1,n.length,m_int+1,length,dest);
}
}
for(i=maxsize-1;i>=0;i--)
if(dest[i]!
=0)
break;
for(intj=0;j<=i;j++)
temp.m_int[j+1]=dest[i-j];
temp.length=i+1;
temp.m_int[0]=flag;
returntemp;
}
CbigintCbigint:
:
operator-(constCbigint&n)
{
return*this+(-n);
}
CbigintCbigint:
:
operator-(longn)
{
return*this+Cbigint(-n);
}
voidCbigint:
:
sum(constchar*str1,intn1,constchar*str2,intn2,char*dest)
{
intinc=0,x=0;
intm=0;
while(n1-->0)
{
n2--;
x=str1[n1]+str2[n2]+inc;
dest[m++]=x%10;
inc=x/10;
}
while(n2-->0)
{
x=str2[n2]+inc;
dest[m++]=x%10;
inc=x/10;
}
dest[m]=inc;
}
CbigintCbigint:
:
operator-()const
{
Cbiginttemp=*this;
if(temp.m_int[0]=='+')
temp.m_int[0]='-';
else
temp.m_int[0]='+';
returntemp;
}
voidCbigint:
:
sub(constchar*str1,intn1,constchar*str2,intn2,char*dest)
{
intm=0,x=0,inc=0;
m=0;
while(n2-->0)
{
n1--;
x=str1[n1]-str2[n2]-inc;
if(x<0)
{
x+=10;
inc=1;
}
else
inc=0;
dest[m++]=x%10;
}
while(n1-->0)
{
x=str1[n1]-inc;
if(x<0)
{
inc=1;
x+=10;
}
dest[m]=x%10;
m++;
}
}
CbigintCbigint:
:
abs()const
{
Cbiginttemp(*this);
temp.m_int[0]='+';
returntemp;
}
ostream&operator<<(ostream&dirt,Cbigint&iv)
{
returndirt<}
istream&operator>>(istream&dirt,Cbigint&iv)
{
chartemp[1000];
dirt>>temp;
iv.init(temp);
returndirt;
}