读书人

关于长整数类的实现,该如何处理

发布时间: 2012-03-05 11:54:02 作者: rapoo

关于长整数类的实现
我定义了一个长整数类longint(任意位数的),其中有重载运算符+、-、*、/、=等,现在我想实现longint a=111221335696543436545463234313,注意:初始化的数是任意长的,而我的构造函数是用字符串来初始化长整数的。怎么实现??还有定义了longint a、b、c三个对象。c=a+b这样表示可以,能不能c=a+124634134343134642任意数?

[解决办法]

C/C++ code
#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;         }                 }            } 


[解决办法]
参考:
大数的四则运算及求模

把代码中的ADD,MINUS,MULTIPLY和DIVIDE分别改成+-*/这样的运算符重载就OK了。
[解决办法]
现在我想实现longint a=111221335696543436545463234313,

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

你最后那个问题也受限于这个问题
[解决办法]
longint a("111221335696543436545463234313");

读书人网 >C++

热点推荐