关于长整数类的实现

number1170196649 2011-07-02 11:09:12
我定义了一个长整数类longint(任意位数的),其中有重载运算符+、-、*、/、=等,现在我想实现longint a=111221335696543436545463234313,注意:初始化的数是任意长的,而我的构造函数是用字符串来初始化长整数的。怎么实现??还有定义了longint a、b、c三个对象。c=a+b这样表示可以,能不能c=a+124634134343134642任意数?
...全文
117 7 点赞 打赏 收藏 举报
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
number1170196649 2011-07-05
谢谢各位,我用的是双向循环链表进行存储这个大整数。看来在构造函数中只能像longint a("111221335696543436545463234313");这样了。因为最初我的想法是将长整数看成是一串字符的。看来我要重载运算符+、-等为opretor+(longint &,char*);

  • 打赏
  • 举报
回复
赵4老师 2011-07-04
longint a("111221335696543436545463234313");

  • 打赏
  • 举报
回复
就想叫yoko 2011-07-04
现在我想实现longint a=111221335696543436545463234313,

这个实现不了吧
因为除了你自己的longint类型
其他基本类型存放不了你赋值的那个大数

你最后那个问题也受限于这个问题
  • 打赏
  • 举报
回复
pathuang68 2011-07-03
参考:
大数的四则运算及求模

把代码中的ADD,MINUS,MULTIPLY和DIVIDE分别改成+-*/这样的运算符重载就OK了。
  • 打赏
  • 举报
回复

big Add1(big b1)
{
if(flag==2&&b1.flag!=2)
{
return b1;
}
if(flag!=2&&b1.flag==2)
{
return *this;
}
if(flag==2&&b1.flag==2)
{
int *x=new int[1];
x[0]=0;
return big(x,1,2);
}
if(flag==1&&b1.flag==0)
{
big b2=*this;
b2.flag=0;
return b1.Abstract(b2);
}
if(flag==0&&b1.flag==1)
{
b1.flag=0;
return Abstract(b1);
}
int i=0,*t,tt=0,kk=0;
if(n<b1.n)
{
t=new int[b1.n+1];
t[b1.n]=0;
while(i<n)
{
tt=b[i]+b1.b[i]+kk;
t[i]=tt%10;
kk=tt/10;
i++;
}
while(i>=n&&i<b1.n)
{
if(kk!=0)
{
tt=b1.b[i]+kk;
t[i]=tt%10;
kk=tt/10;
i++;
}
else
{
t[i]=b1.b[i];
i++;
}
}
if(kk!=0)
{
t[i]=kk;
}
/*

*/
int iii=b1.n+1;
for(int ii=b1.n;ii>=0;ii--)
{
if(t[ii]==0)
{

iii=iii-1;
}
if(t[ii]!=0)
break;
}
int *ff=new int[iii];
for(int jj=0;jj<iii;jj++)
{
ff[jj]=t[jj];
}
delete []t;
if(flag==1&&b1.flag==1)
{
big B=big(ff,iii,1);
return B;
}
big B=big(ff,iii,0);
return B;
}

else
{
t=new int[n+1];
t[n]=0;
while(i<b1.n)
{
tt=b[i]+b1.b[i]+kk;
t[i]=tt%10;
kk=tt/10;
i++;
}
while(i>=b1.n&&i<n)
{
if(kk!=0)
{
tt=b[i]+kk;
t[i]=tt%10;
kk=tt/10;
i++;
}
else
{
t[i]=b[i];
i++;
}
}
if(kk!=0)
{
t[i]=kk;
}
int iii=n+1;
for(int ii=n;ii>=0;ii--)
{
if(t[ii]==0)
{

iii=iii-1;
}
if(t[ii]!=0)
break;
}
int *ff=new int[iii];
for(int jj=0;jj<iii;jj++)
{
ff[jj]=t[jj];
}
delete []t;
if(flag==1&&b1.flag==1)
{
big B=big(ff,iii,1);
return B;
}
big B=big(ff,iii,0);
return B;
}

}
big Abstract1(big b1)
{
if(flag==2&&b1.flag!=2)
{
b1.flag==0?1:0;
return b1;
}
if(flag!=2&&b1.flag==2)
{
return *this;
}
if(flag==2&&b1.flag==2)
{
int *x=new int[1];
x[0]=0;
return big(x,1,2);
}
if(flag==1&&b1.flag==0)
{
big b2=*this;
b1.flag=1;
return b1.Add(b2);
}
if(flag==0&&b1.flag==1)
{
b1.flag=0;
return Add(b1);
}
int i=0,*t,tt=0,kk=0;
if(n<b1.n)
{
t=new int[b1.n];
for(int gg=0;gg<b1.n;gg++)
t[gg]=0;
while(i<n)
{
if(b1.b[i]>=b[i])
{
t[i]=b1.b[i]-b[i];
}
else
{
int j=i+1;
while(b1.b[j]==0)
{
j++;
}
b1.b[j]=b1.b[j]-1;
for(int w=j-1;w>=i+1;w--)
b1.b[w]=9;
b1.b[i]=10+b1.b[i];
t[i]=b1.b[i]-b[i];
}
i++;
}
while(i>=n&&i<b1.n)
{
t[i]=b1.b[i];
i++;
}
int iii=b1.n;
for(int ii=b1.n-1;ii>=0;ii--)
{
if(t[ii]==0)
{

iii=iii-1;
}
if(t[ii]!=0)
break;
}
int *ff=new int[iii];
for(int jj=0;jj<iii;jj++)
{
ff[jj]=t[jj];
}
delete []t;
if(flag==1&&b1.flag==1)
{
big B=big(ff,iii,0);
return B;
}
big B=big(ff,iii,1);
return B;
}
if(n>b1.n)
{
t=new int[n];
for(int gg=0;gg<n;gg++)
t[gg]=0;
while(i<b1.n)
{
if(b[i]>=b1.b[i])
{
t[i]=b[i]-b1.b[i];
}
else
{
int j=i+1;
while(b[j]==0)
{
j++;
}
b[j]=b[j]-1;
for(int w=j-1;w>=i+1;w--)
b[w]=9;
b[i]=10+b[i];
t[i]=b[i]-b1.b[i];
}
i++;
}
while(i>=b1.n&&i<n)
{
t[i]=b[i];
i++;
}
int iii=n;
for(int ii=n-1;ii>=0;ii--)
{
if(t[ii]==0)
{

iii=iii-1;
}
if(t[ii]!=0)
break;
}
int *ff=new int[iii];
for(int jj=0;jj<iii;jj++)
{
ff[jj]=t[jj];
}
delete []t;
if(flag==1&&b1.flag==1)
{
big B=big(ff,iii,1);
return B;
}
big B=big(ff,iii,0);
return B;
}
if(n==b1.n)
{
int flag1=2;
t=new int[b1.n];
for(int gg=0;gg<b1.n;gg++)
t[gg]=0;
for(gg=b1.n-1;gg>=0;gg--)
{

if(b[gg]==b1.b[gg])
continue;
if(b[gg]<b1.b[gg])
{
flag1=1;
break;
}
if(b[gg]>b1.b[gg])
{
flag1=0;
break;
}
}
while(i<b1.n)
{
if(flag1==0)
{
if(b[i]>=b1.b[i])
{
t[i]=b[i]-b1.b[i];
}
else
{
int j=i+1;
while(b[j]==0)
{
j++;
}
b[j]=b[j]-1;
for(int w=j-1;w>=i+1;w--)
b[w]=9;
b[i]=10+b[i];
t[i]=b[i]-b1.b[i];
}
}
if(flag1==1)
{
if(b1.b[i]>=b[i])
{
t[i]=b1.b[i]-b[i];
}
else
{
int j=i+1;
while(b1.b[j]==0)
{
j++;
}
b1.b[j]=b1.b[j]-1;
for(int w=j-1;w>=i+1;w--)
b1.b[w]=9;
b1.b[i]=10+b1.b[i];
t[i]=b1.b[i]-b[i];
}
}
if(flag1==2)
{
int *z=new int[1];
z[0]=0;
return big(z,1,2);
}
i++;
}
if(flag1==0)
{
int iii=b1.n;
for(int ii=b1.n-1;ii>=0;ii--)
{
if(t[ii]==0)
{
iii=iii-1;
}
if(t[ii]!=0)
break;
}
int *ff=new int[iii];
for(int jj=0;jj<iii;jj++)
{
ff[jj]=t[jj];
}
delete []t;
if(flag==1&&b1.flag==1)
{
big B=big(ff,iii,1);
return B;
}
big B=big(ff,iii,0);
return B;
}
if(flag1==1)
{
int iii=b1.n;
for(int ii=b1.n-1;ii>=0;ii--)
{
if(t[ii]==0)
{
iii=iii-1;
}
if(t[ii]!=0)
break;
}
int *ff=new int[iii];
for(int jj=0;jj<iii;jj++)
{
ff[jj]=t[jj];
}
delete []t;
if(flag==1&&b1.flag==1)
{
big B=big(ff,iii,0);
return B;
}
big B=big(ff,iii,1);
return B;
}

}

}
///////////////////////////////////////////////
};


仅供参考!
  • 打赏
  • 举报
回复

big Multi(big b1)
{
if(flag==2&&b1.flag!=2)
{
int *x=new int[1];
x[0]=0;
return big(x,1,2);
}
if(flag!=2&&b1.flag==2)
{
int *x=new int[1];
x[0]=0;
return big(x,1,2);
}
if(flag==2&&b1.flag==2)
{
int *x=new int[1];
x[0]=0;
return big(x,1,2);
}
int i=0,*t=new int[n+b1.n],tt=0,kk=0,**r=new int*[b1.n],q=0;
for(int rr=0;rr<b1.n;rr++)
{
r[rr]=new int[n+b1.n];
}
for(int s=0;s<b1.n;s++)
{
for(int s1=0;s1<n+b1.n;s1++)
{
r[s][s1]=0;
if(t[s1]!=0)
t[s1]=0;
}
}
for(int ii=0;ii<b1.n;ii++)
{
for(int jj=0;jj<n;jj++)
{
tt=b1.b[ii]*b[jj]+kk;
r[ii][q+jj]=tt%10;
kk=tt/10;
if(jj==n-1&&kk!=0)
r[ii][q+jj+1]=kk;

}
kk=0;
q++;
}
tt=0;
kk=0;
for(int qq=0;qq<n+b1.n;qq++)
{
for(int qq1=0;qq1<b1.n;qq1++)
{
tt+=r[qq1][qq];
}
tt+=kk;
t[i]=tt%10;
kk=tt/10;
i++;
tt=0;
}
int iii=n+b1.n;
for(int ii1=n+b1.n-1;ii1>=0;ii1--)
{
if(t[ii1]==0)
{
iii=iii-1;
}
if(t[ii1]!=0)
break;
}
int *ff=new int[iii];
for(int jj1=0;jj1<iii;jj1++)
{
ff[jj1]=t[jj1];
}
delete []t;
if((flag==1&&b1.flag==0)||(flag==0&&b1.flag==1))
{
big B=big(ff,iii,1);
return B;
}
big B=big(ff,iii,0);
return B;


}
big onetofour()
{
int l[4],r;
int *a=new int[n/4+n%4==0?0:1];
for(int i=0;i<n;i++)
{

if(i%4==0&&i!=0)
{
r=l[0]+l[1]*10+l[2]*100+l[3]*1000;
a[i/4-1]=r;
l[0]=0;l[1]=0;l[2]=0;l[3]=0;
}
l[i%4]=b[i];
}
r=l[0]+l[1]*10+l[2]*100+l[3]*1000;
if(n%4==0)
a[n/4-1]=r;
if(n%4!=0)
{
a[n/4]=r;
}
big B=big(a,n/4+n%4,0);
return B;
}
big Div(big b1)
{
if(flag==2&&b1.flag!=2)
{
int *x=new int[1];
x[0]=0;
return big(x,1,2);
}
if(flag!=2&&b1.flag==2)
{
cout<<"'a/0' is wrong!!!"<<endl;
int *x=new int[1];
x[0]=0;
return big(x,1,2);
}
if(flag==2&&b1.flag==2)
{
cout<<"'a/0' is wrong!!!"<<endl;
int *x=new int[1];
x[0]=0;
return big(x,1,2);
}
if(n<b1.n)
{
int *x=new int[1];
x[0]=0;
return big(x,1,2);
}
int i,j,k=0,*m=new int[n],nn=0;
for(i=0;i<n;i++)
m[i]=0;
int *e=new int[b1.n+1];
big B,B1=b1,B2,B3=b1,B4,B5=b1;
Inverse();
while(k<n)
{
if(k==0)
{
for(i=0;i<b1.n;i++)
{
e[i]=b[i];
}
k=b1.n;
}
if(nn!=0)
{
B3.Inverse();
for(i=0;i<b1.n;i++)
{
if(i<B3.n&&B3.flag!=2)
e[i]=B3.b[i];
else
{
if(k<n)
{
e[i]=b[k];
k++;
m[nn]=0;
nn++;
}
else
break;
}
}
nn--;
}

B=big(e,i,0);
B.Inverse();
B2=B.Abstract1(B1);
if(B2.flag==2)
{
int *x=new int[1];
x[0]=0;
B3=big(x,1,2);
m[nn]=1;
}
if(B2.flag==1)
{
if(k<n)
{
B.Inverse();
e[i]=b[k];
k=k+1;
nn++;
}
else
{
nn++;
break;
}
B=big(e,i+1,0);
B.Inverse();
for(j=2;j<=9;j++)
{
int *t=new int[1];
t[0]=j;
B4=big(t,1,0);
B3=b1;
B3=B3.Multi(B4);
B4=B.Abstract1(B3);
if(B4.flag==1)
{
B3=B.Abstract1(B5);
m[nn]=j-1;
break;
}
if(B4.flag==2)
{
int *qqq=new int[1];
qqq[0]=0;
B3=big(qqq,1,2);
m[nn]=j;
break;
}
B5=B3;
}
}
if(B2.flag==0)
{
for(j=2;j<=9;j++)
{
int *t=new int[1];
t[0]=j;
B4=big(t,1,0);
B3=b1;
B3=B3.Multi(B4);
B4=B.Abstract1(B3);
if(B4.flag==1)
{
B3=B.Abstract1(B5);
m[nn]=j-1;
break;
}
if(B4.flag==2)
{
int *qqq=new int[1];
qqq[0]=0;
B3=big(qqq,1,2);
m[nn]=j;
break;
}
B5=B3;
}
}
nn++;
}

for(int xxx=0;xxx<nn/2;xxx++)
{
int xx;
xx=m[xxx];
m[xxx]=m[nn-1-xxx];
m[nn-1-xxx]=xx;
}
int iii=n;
for(int ii1=n-1;ii1>=0;ii1--)
{
if(m[ii1]==0)
{
iii=iii-1;
}
if(m[ii1]!=0)
break;
}
int *ff=new int[iii];
for(int jj1=0;jj1<iii;jj1++)
{
ff[jj1]=m[jj1];
}
delete []m;
if((flag==1&&b1.flag==0)||(flag==0&&b1.flag==1))
{
big B=big(ff,iii,1);
return B;
}
B=big(ff,iii,0);
Inverse();
return B;
}
big Mod(big b1)
{
big B=*this;
if(B.flag==1)
{
while(B.flag==1)
{
B=B.Add1(b1);
}
return B;
}
if(B.flag==2)
{
int *t=new int[1];
t[0]=0;
return big(t,1,2);
}
big B1=B.Div(b1);
B1=B1.Multi(b1);
B=B.Abstract1(B1);
return B;
}
void Inverse()
{
int j;
for(int i=0;i<n/2;i++)
{
j=b[i];
b[i]=b[n-1-i];
b[n-1-i]=j;
}
}
///////////////////////////////////////////////
  • 打赏
  • 举报
回复

#include<iostream>
#include<cstring>
using namespace std;
class big
{
public:
big(int *b,int n,int flag)
{
this->b=b;
this->n=n;
this->flag=flag;
}
big(){}
~big(){}
int *b;//大数组成的数组
int n;//大数的长度
int flag;//正负标志0是正1是负2是零
bool iszheng()
{
if(flag==0)
return true;
if(flag==1)
return false;
}
bool isling()
{
if(flag==2)
return true;
return false;
}
big Add(big b1)
{
if(flag==2&&b1.flag!=2)
{
return b1;
}
if(flag!=2&&b1.flag==2)
{
return *this;
}
if(flag==2&&b1.flag==2)
{
int *x=new int[1];
x[0]=0;
return big(x,1,2);
}
if(flag==1&&b1.flag==0)
{
big b2=*this;
return b1.Abstract(b2);
}
if(flag==0&&b1.flag==1)
{
return Abstract(b1);
}
int i=0,*t,tt=0,kk=0;
if(n<b1.n)
{
t=new int[b1.n+1];
t[b1.n]=0;
while(i<n)
{
tt=b[i]+b1.b[i]+kk;
t[i]=tt%10000;
kk=tt/10000;
i++;
}
while(i>=n&&i<b1.n)
{
if(kk!=0)
{
tt=b1.b[i]+kk;
t[i]=tt%10000;
kk=tt/10000;
i++;
}
else
{
t[i]=b1.b[i];
i++;
}
}
if(kk!=0)
{
t[i]=kk;
}
/*

*/
int iii=b1.n+1;
for(int ii=b1.n;ii>=0;ii--)
{
if(t[ii]==0)
{

iii=iii-1;
}
if(t[ii]!=0)
break;
}
int *ff=new int[iii];
for(int jj=0;jj<iii;jj++)
{
ff[jj]=t[jj];
}
delete []t;
if(flag==1&&b1.flag==1)
{
big B=big(ff,iii,1);
return B;
}
big B=big(ff,iii,0);
return B;
}

else
{
t=new int[n+1];
t[n]=0;
while(i<b1.n)
{
tt=b[i]+b1.b[i]+kk;
t[i]=tt%10000;
kk=tt/10000;
i++;
}
while(i>=b1.n&&i<n)
{
if(kk!=0)
{
tt=b[i]+kk;
t[i]=tt%10000;
kk=tt/10000;
i++;
}
else
{
t[i]=b[i];
i++;
}
}
if(kk!=0)
{
t[i]=kk;
}
int iii=n+1;
for(int ii=n;ii>=0;ii--)
{
if(t[ii]==0)
{

iii=iii-1;
}
if(t[ii]!=0)
break;
}
int *ff=new int[iii];
for(int jj=0;jj<iii;jj++)
{
ff[jj]=t[jj];
}
delete []t;
if(flag==1&&b1.flag==1)
{
big B=big(ff,iii,1);
return B;
}
big B=big(ff,iii,0);
return B;
}

}
big Abstract(big b1)
{
if(flag==2&&b1.flag!=2)
{
b1.flag==0?1:0;
return b1;
}
if(flag!=2&&b1.flag==2)
{
return *this;
}
if(flag==2&&b1.flag==2)
{
int *x=new int[1];
x[0]=0;
return big(x,1,2);
}
if(flag==1&&b1.flag==0)
{
big b2=*this;
b1.flag=1;
return b1.Add(b2);
}
if(flag==0&&b1.flag==1)
{
b1.flag=0;
return Add(b1);
}
int i=0,*t,tt=0,kk=0;
if(n<b1.n)
{
t=new int[b1.n];
for(int gg=0;gg<b1.n;gg++)
t[gg]=0;
while(i<n)
{
if(b1.b[i]>=b[i])
{
t[i]=b1.b[i]-b[i];
}
else
{
int j=i+1;
while(b1.b[j]==0)
{
j++;
}
b1.b[j]=b1.b[j]-1;
for(int w=j-1;w>=i+1;w--)
b1.b[w]=9999;
b1.b[i]=10000+b1.b[i];
t[i]=b1.b[i]-b[i];
}
i++;
}
while(i>=n&&i<b1.n)
{
t[i]=b1.b[i];
i++;
}
int iii=b1.n;
for(int ii=b1.n-1;ii>=0;ii--)
{
if(t[ii]==0)
{

iii=iii-1;
}
if(t[ii]!=0)
break;
}
int *ff=new int[iii];
for(int jj=0;jj<iii;jj++)
{
ff[jj]=t[jj];
}
delete []t;
if(flag==1&&b1.flag==1)
{
big B=big(ff,iii,0);
return B;
}
big B=big(ff,iii,1);
return B;
}
if(n>b1.n)
{
t=new int[n];
for(int gg=0;gg<n;gg++)
t[gg]=0;
while(i<b1.n)
{
if(b[i]>=b1.b[i])
{
t[i]=b[i]-b1.b[i];
}
else
{
int j=i+1;
while(b[j]==0)
{
j++;
}
b[j]=b[j]-1;
for(int w=j-1;w>=i+1;w--)
b[w]=9999;
b[i]=10000+b[i];
t[i]=b[i]-b1.b[i];
}
i++;
}
while(i>=b1.n&&i<n)
{
t[i]=b[i];
i++;
}
int iii=n;
for(int ii=n-1;ii>=0;ii--)
{
if(t[ii]==0)
{

iii=iii-1;
}
if(t[ii]!=0)
break;
}
int *ff=new int[iii];
for(int jj=0;jj<iii;jj++)
{
ff[jj]=t[jj];
}
delete []t;
if(flag==1&&b1.flag==1)
{
big B=big(ff,iii,1);
return B;
}
big B=big(ff,iii,0);
return B;
}
if(n==b1.n)
{
int flag1=2;
t=new int[b1.n];
for(int gg=0;gg<b1.n;gg++)
t[gg]=0;
for(gg=b1.n-1;gg>=0;gg--)
{

if(b[gg]==b1.b[gg])
continue;
if(b[gg]<b1.b[gg])
{
flag1=1;
break;
}
if(b[gg]>b1.b[gg])
{
flag1=0;
break;
}
}
while(i<b1.n)
{
if(flag1==0)
{
if(b[i]>=b1.b[i])
{
t[i]=b[i]-b1.b[i];
}
else
{
int j=i+1;
while(b[j]==0)
{
j++;
}
b[j]=b[j]-1;
for(int w=j-1;w>=i+1;w--)
b[w]=9999;
b[i]=10000+b[i];
t[i]=b[i]-b1.b[i];
}
}
if(flag1==1)
{
if(b1.b[i]>=b[i])
{
t[i]=b1.b[i]-b[i];
}
else
{
int j=i+1;
while(b1.b[j]==0)
{
j++;
}
b1.b[j]=b1.b[j]-1;
for(int w=j-1;w>=i+1;w--)
b1.b[w]=9999;
b1.b[i]=10000+b1.b[i];
t[i]=b1.b[i]-b[i];
}
}
if(flag1==2)
{
int *z=new int[1];
z[0]=0;
return big(z,1,2);
}
i++;
}
if(flag1==0)
{
int iii=b1.n;
for(int ii=b1.n-1;ii>=0;ii--)
{
if(t[ii]==0)
{
iii=iii-1;
}
if(t[ii]!=0)
break;
}
int *ff=new int[iii];
for(int jj=0;jj<iii;jj++)
{
ff[jj]=t[jj];
}
delete []t;
if(flag==1&&b1.flag==1)
{
big B=big(ff,iii,1);
return B;
}
big B=big(ff,iii,0);
return B;
}
if(flag1==1)
{
int iii=b1.n;
for(int ii=b1.n-1;ii>=0;ii--)
{
if(t[ii]==0)
{
iii=iii-1;
}
if(t[ii]!=0)
break;
}
int *ff=new int[iii];
for(int jj=0;jj<iii;jj++)
{
ff[jj]=t[jj];
}
delete []t;
if(flag==1&&b1.flag==1)
{
big B=big(ff,iii,0);
return B;
}
big B=big(ff,iii,1);
return B;
}

}

}

  • 打赏
  • 举报
回复
相关推荐
发帖
其它技术问题
创建于2007-09-28

3849

社区成员

C/C++ 其它技术问题
申请成为版主
帖子事件
创建了帖子
2011-07-02 11:09
社区公告
暂无公告