大きい整数クラスの4則演算と論理演算




今日「アルゴリズムコンテストと入門基礎」の大きな整数クラスを見た後、私自身も大きな整数クラスを実現してみました.そして、整数の4つの演算と論理演算機能を完成しました.いろいろ勉強しました.ここで共有します.コードはC++です.C++のSTLテンプレートクラスvectorを使用しました.
大きい整数クラスのデータストレージ構造は次のようになります.
        static const int BASE=100000000;         static const int WIDTH=8;         std::vector s;
以下、本の中の既存の基礎の上で乗除と減算のコードを書き続けます.
class BigInteger
{
public:
    //      
    static const int BASE=100000000;
    static const int WIDTH=8;
    std::vector s;
	
    //    
    BigInteger(long long num=0)
    {
        *this=num;
    }
    //long long       
    BigInteger operator = (long long num)
    {
        s.clear();
        do{
            s.push_back(num%BASE);
            num/=BASE;
        }while(num);
        return *this;
    }
    //string      
    BigInteger operator = (const std::string &str)
    {
        s.clear();
        int x,len=(str.length()-1)/WIDTH+1;
        for(int i=0;i
            //       
            int end=str.length()-i*WIDTH;
            int start=std::max(0,end-WIDTH);
            // sscnaf      ,          ,            ,         。
            sscanf(str.substr(start,end-start).c_str(),"%d",&x);
            s.push_back(x);
        }
        return *this;
    }
    //  
    BigInteger operator + (const BigInteger& b) const
    {
        BigInteger c;
        c.s.clear();
        for(int i=0,g=0;;i++)
        {
            if(g==0&&i>=s.size()&&i>=b.s.size())
                break;
            int x=g;
            if(i
    //        ,               
    BigInteger operator - (const BigInteger& b) const
    {
        BigInteger c;
        c.s.clear();
        int MAX=std::max(s.size(),b.s.size());
        for(int i=0,g=0;;i++)
        {
            if(g==0&&i>=MAX)
                break;
            int x=g;
            if(i
            //!!!!!!
            if(i==MAX-1)
                c.s.push_back(x%BASE);
            else
                c.s.push_back(abs(x%BASE));
            //!!!!!!
            g=x/BASE;
        }
        return c;
    }
    BigInteger operator -= (const BigInteger& b)
    {
        *this=*this-b;
        return *this;
    }
    //    ,     ,  vector             string  ,       ,          。
    BigInteger operator * (const BigInteger& b)
    {
        std::stringstream ss;
        for(int i=s.size()-1;i>=0;i--)
            ss<=0;i--)
            ss<

        // string        int   
        std::vector c,d,temp;
        for(int i=operand1.length()-1;i>=0;i--)
            c.push_back(operand1[i]-'0');
        for(int i=operand2.length()-1;i>=0;i--)
            d.push_back(operand2[i]-'0');

        int MAX=std::max(c.size(),d.size());
        for(int i=0;i9)
            {
                temp[i+1]+=temp[i]/10;
                temp[i]%=10;
            }
        int m=2*MAX;
        while(temp[m]==0)
            m--;

        BigInteger another;
        another.s.clear();
        int len=(m-1)/WIDTH+1;

        for(int i=0;i
    //      ,     int      
    BigInteger operator / (const BigInteger& b)
    {
        std::string operand1,operand2,result;
        std::stringstream ss;
        for(int i=s.size()-1;i>=0;i--)
            ss<=0;i--)
            ss< c,d;
        for(int i=0;id[j])    //       operand1 > operand2
                        {
                            ok=1;
                            break;
                        }
                        else if(c[i+j]
    //                    ,    
    BigInteger operator % (const BigInteger& b)
    {
        BigInteger c;
        c=*this-(*this/b)*b;
        return c;
    }
    BigInteger operator %= (const BigInteger& b)
    {
        *this=*this%b;
        return *this;
    }
    bool operator < (const BigInteger& b) const
    {
        if(s.size()!=b.s.size())
            return s.size()=0;i--)
            if(s[i]!=b.s[i])
                return  s[i] (const BigInteger& b) const
    {
        return b= (const BigInteger& b) const
    {
        return !(*thisb;
    }
    bool operator == (const BigInteger& b) const
    {
        return !(*thisb);
    }
    friend std::ostream& operator << (std::ostream& out,const BigInteger& x)
    {
        out<=0;i--)
        {
            char buf[20];
            sprintf(buf,"%08d",x.s[i]);
            for(int j=0;j> (std::istream& in,BigInteger& x)
    {
        std::string s;
        if(!(in>>s))
            return in;
        x=s;
        return in;
    }
};

                ,   。
              ,            ,       ,           。
        :《         》。