[中等] 比较完整的BigInteger高精度整数类(C++实现)

       首先有读者可能觉得写一个高精度整数不是必备技能吗,怎么还算中等难度,应该算容易啊。我之所以将其划为中等难度,是因为确实本身写一个高精度整数是必备技能,而且其思想基本就是手算的思想,思想并不难,但是要想写一个比较完整而且没有错误的高精度整数类不是那么容易,编码上细节较多,容易出错,因此特将其划为中等难度。这并不影响其为一个必备技能。


       其中BigInteger/BigInteger用得应该会少一些,下面代码中的这个函数需要进一步的测试,不过其思想并不难。

另外对于求模运算,可以容易地通过除法运算的代码获得。


具体代码:

#include 
#include 
#include 

using namespace std;
struct BigInteger
{
    vector s;
    static const int BASE=10000;
    static const int WIDTH=4;
    void standardize()
    {
        for(int i=s.size()-1;i>=0;--i)
        {
            if(s[i]==0)
                s.pop_back();
            else
                break;
        }
        if(s.empty())
            s.push_back(0);
    }

    BigInteger& operator = (long long num)
    {
        s.clear();
        do
        {
            s.push_back(num%BASE);
            num/=BASE;
        }while(num>0);
        return *this;
    }
    BigInteger& operator = (const string& num)
    {
        s.clear();
        int len=(num.size()-1)/WIDTH+1;
        int x=0;
        for(int i=0;i0)
        {
            ans.s.push_back(carry);
        }
        return ans;
    }
    BigInteger operator * (const BigInteger& rhs) const
    {
        BigInteger ans;
        for(int i=0;i0)
            {
                lans.s.push_back(carry%BASE);
                carry/=BASE;
            }
            ans=ans+lans;
        }
        return ans;
    }
    BigInteger operator - (const BigInteger& rhs) const
    {
        BigInteger ans;
        int carry=0;
        for(int i=0;i t;
        long long rmder=0;
        for(int i=s.size()-1;i>=0;--i)
        {
            long long temp=rmder*BASE+s[i];
            long long div=temp/rhs;
            rmder=temp%rhs;
            t.push_back(div);
        }
        for(int i=t.size()-1;i>=0;--i)
            ans.s.push_back(t[i]);
        ans.standardize();
        return ans;
    }

    friend ostream& operator << (ostream& out,const BigInteger& rhs)
    {
        out<=0;--i)
        {
            char buf[5];
            sprintf(buf,"%04d",rhs.s[i]);
            cout<=0;--i)
        {
            if(s[i]!=rhs.s[i])
                return s[i]


你可能感兴趣的:(ACM)