大数模板 poj3982

来源:互联网 发布:万维网中文域名 编辑:程序博客网 时间:2024/06/16 12:50

1.

  这个模板不是自己写的,转载的别人转载的,还没学完c++的我,想写也没有那能力。

这个模板我用在了POJ的一道题上,传送门--POJ3982

  一般大数的题,都可用这个模板解决,只需要修改主函数就好了,但是如果不能独立写出来的话,不相当于白搭吗,所以我学完c++后会手写出模板的!!

  注意,这个大数模板只适用于不太大的模拟,几万位,肯定会爆内存的,后续会补上功能更强大的模板和JAVA大数模板!

    #include<iostream>    #include<cstdio>    #include<string>    #include<cstring>    #include<iomanip>    #include<algorithm>    using namespace std;    #define MAXN 9999    #define MAXSIZE 10    #define DLEN 4    class BigNum    {    private:        int a[500];    //可以控制大数的位数        int len;       //大数长度    public:        BigNum(){ len = 1;memset(a,0,sizeof(a)); }   //构造函数        BigNum(const int);       //将一个int类型的变量转化为大数        BigNum(const char*);     //将一个字符串类型的变量转化为大数        BigNum(const BigNum &);  //拷贝构造函数        BigNum &operator=(const BigNum &);   //重载赋值运算符,大数之间进行赋值运算        friend istream& operator>>(istream&,  BigNum&);   //重载输入运算符        friend ostream& operator<<(ostream&,  BigNum&);   //重载输出运算符        BigNum operator+(const BigNum &) const;   //重载加法运算符,两个大数之间的相加运算        BigNum operator-(const BigNum &) const;   //重载减法运算符,两个大数之间的相减运算        BigNum operator*(const BigNum &) const;   //重载乘法运算符,两个大数之间的相乘运算        BigNum operator/(const int   &) const;    //重载除法运算符,大数对一个整数进行相除运算        BigNum operator^(const int  &) const;    //大数的n次方运算        int    operator%(const int  &) const;    //大数对一个int类型的变量进行取模运算        bool   operator>(const BigNum & T)const;   //大数和另一个大数的大小比较        bool   operator>(const int & t)const;      //大数和一个int类型的变量的大小比较        void print();       //输出大数    };    BigNum::BigNum(const int b)     //将一个int类型的变量转化为大数    {        int c,d = b;        len = 0;        memset(a,0,sizeof(a));        while(d > MAXN)        {            c = d - (d / (MAXN + 1)) * (MAXN + 1);            d = d / (MAXN + 1);            a[len++] = c;        }        a[len++] = d;    }    BigNum::BigNum(const char*s)     //将一个字符串类型的变量转化为大数    {        int t,k,index,l,i;        memset(a,0,sizeof(a));        l=strlen(s);        len=l/DLEN;        if(l%DLEN)            len++;        index=0;        for(i=l-1;i>=0;i-=DLEN)        {            t=0;            k=i-DLEN+1;            if(k<0)                k=0;            for(int j=k;j<=i;j++)                t=t*10+s[j]-'0';            a[index++]=t;        }    }    BigNum::BigNum(const BigNum & T) : len(T.len)  //拷贝构造函数    {        int i;        memset(a,0,sizeof(a));        for(i = 0 ; i < len ; i++)            a[i] = T.a[i];    }    BigNum & BigNum::operator=(const BigNum & n)   //重载赋值运算符,大数之间进行赋值运算    {        int i;        len = n.len;        memset(a,0,sizeof(a));        for(i = 0 ; i < len ; i++)            a[i] = n.a[i];        return *this;    }    istream& operator>>(istream & in,  BigNum & b)   //重载输入运算符    {        char ch[MAXSIZE*4];        int i = -1;        in>>ch;        int l=strlen(ch);        int count=0,sum=0;        for(i=l-1;i>=0;)        {            sum = 0;            int t=1;            for(int j=0;j<4&&i>=0;j++,i--,t*=10)            {                sum+=(ch[i]-'0')*t;            }            b.a[count]=sum;            count++;        }        b.len =count++;        return in;    }    ostream& operator<<(ostream& out,  BigNum& b)   //重载输出运算符    {        int i;        cout << b.a[b.len - 1];        for(i = b.len - 2 ; i >= 0 ; i--)        {            cout.width(DLEN);            cout.fill('0');            cout << b.a[i];        }        return out;    }    BigNum BigNum::operator+(const BigNum & T) const   //两个大数之间的相加运算    {        BigNum t(*this);        int i,big;      //位数        big = T.len > len ? T.len : len;        for(i = 0 ; i < big ; i++)        {            t.a[i] +=T.a[i];            if(t.a[i] > MAXN)            {                t.a[i + 1]++;                t.a[i] -=MAXN+1;            }        }        if(t.a[big] != 0)            t.len = big + 1;        else            t.len = big;        return t;    }    BigNum BigNum::operator-(const BigNum & T) const   //两个大数之间的相减运算    {        int i,j,big;        bool flag;        BigNum t1,t2;        if(*this>T)        {            t1=*this;            t2=T;            flag=0;        }        else        {            t1=T;            t2=*this;            flag=1;        }        big=t1.len;        for(i = 0 ; i < big ; i++)        {            if(t1.a[i] < t2.a[i])            {                j = i + 1;                while(t1.a[j] == 0)                    j++;                t1.a[j--]--;                while(j > i)                    t1.a[j--] += MAXN;                t1.a[i] += MAXN + 1 - t2.a[i];            }            else                t1.a[i] -= t2.a[i];        }        t1.len = big;        while(t1.a[t1.len-1] == 0 && t1.len > 1)        {            t1.len--;            big--;        }        if(flag)            t1.a[big-1]=0-t1.a[big-1];        return t1;    }    BigNum BigNum::operator*(const BigNum & T) const   //两个大数之间的相乘运算    {        BigNum ret;        int i,j,up;        int temp,temp1;        for(i = 0 ; i < len ; i++)        {            up = 0;            for(j = 0 ; j < T.len ; j++)            {                temp = a[i] * T.a[j] + ret.a[i + j] + up;                if(temp > MAXN)                {                    temp1 = temp - temp / (MAXN + 1) * (MAXN + 1);                    up = temp / (MAXN + 1);                    ret.a[i + j] = temp1;                }                else                {                    up = 0;                    ret.a[i + j] = temp;                }            }            if(up != 0)                ret.a[i + j] = up;        }        ret.len = i + j;        while(ret.a[ret.len - 1] == 0 && ret.len > 1)            ret.len--;        return ret;    }    BigNum BigNum::operator/(const int & b) const   //大数对一个整数进行相除运算    {        BigNum ret;        int i,down = 0;        for(i = len - 1 ; i >= 0 ; i--)        {            ret.a[i] = (a[i] + down * (MAXN + 1)) / b;            down = a[i] + down * (MAXN + 1) - ret.a[i] * b;        }        ret.len = len;        while(ret.a[ret.len - 1] == 0 && ret.len > 1)            ret.len--;        return ret;    }    int BigNum::operator %(const int & b) const    //大数对一个int类型的变量进行取模运算    {        int i,d=0;        for (i = len-1; i>=0; i--)        {            d = ((d * (MAXN+1))% b + a[i])% b;        }        return d;    }    BigNum BigNum::operator^(const int & n) const    //大数的n次方运算    {        BigNum t,ret(1);        int i;        if(n<0)            exit(-1);        if(n==0)            return 1;        if(n==1)            return *this;        int m=n;        while(m>1)        {            t=*this;            for( i=1;i<<1<=m;i<<=1)            {                t=t*t;            }            m-=i;            ret=ret*t;            if(m==1)                ret=ret*(*this);        }        return ret;    }    bool BigNum::operator>(const BigNum & T) const   //大数和另一个大数的大小比较    {        int ln;        if(len > T.len)            return true;        else if(len == T.len)        {            ln = len - 1;            while(a[ln] == T.a[ln] && ln >= 0)                ln--;            if(ln >= 0 && a[ln] > T.a[ln])                return true;            else                return false;        }        else            return false;    }    bool BigNum::operator >(const int & t) const    //大数和一个int类型的变量的大小比较    {        BigNum b(t);        return *this>b;    }    void BigNum::print()    //输出大数    {        int i;        cout << a[len - 1];        for(i = len - 2 ; i >= 0 ; i--)        {            cout.width(DLEN);            cout.fill('0');            cout << a[i];        }        cout << endl;    }    int main(void)    {        int i,n;        int a,b,c;        BigNum x[101];      //定义大数的对象数组        while(~scanf("%d%d%d",&a,&b,&c))        {            x[0]=a,x[1]=b,x[2]=c;             for(i=3;i<101;i++)                x[i]=x[i-1]+x[i-2]+x[i-3];                    x[99].print();        }    }

2.

  另附刘汝佳书上的大数模板

#include<iostream>//#include<cstdio>#include<string>#include<vector>#include<algorithm>#include<cstring>using namespace std;struct BigInteger{    static const int BASE = 100000000;    static const int WIDTH = 8;    vector<int>s;    BigInteger(long long num=0){*this = num;}//构造函数    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<s.size())                x+=s[i];            if(i<b.s.size())                x+=b.s[i];            c.s.push_back(x%BASE);            g=x/BASE;        }        return c;    }    BigInteger operator = (long long num)//赋值运算符(数字的)    {        s.clear();        do{            s.push_back(num % BASE);            num /= BASE;        }while(num > 0);        return *this;    }    BigInteger operator = (const string &str)//赋值运算符(字符串的)    {        s.clear();        int x,len = (str.length()-1) / WIDTH + 1;        for(int i=0;i<len;i++)        {            int end = str.length() - i * WIDTH;            int start = max(0,end - WIDTH);            sscanf(str.substr(start,end - start).c_str(),"%d",&x);            s.push_back(x);        }        return *this;    }};ostream& operator << (ostream &out,const BigInteger& x)//重载输出运算符{    out << x.s.back();    for(int i=x.s.size()-2;i>=0;i--)    {        char buf[20];        sprintf(buf,"%08d",x.s[i]);        for(int j=0;j<strlen(buf);j++)            out  << buf[j];    }    return out;}istream& operator >> (istream &in,BigInteger& x)//重载输入运算符{    string s;    if(!(in >> s))        return in;    x=s;    return in;}int main(){    BigInteger a,b;    while(cin>>a>>b)    {        cout<<a+b<<endl;    }    return 0;;}


0 0
原创粉丝点击