HDOJ 1133 Buy the Ticket 简单解题报告

    和前几天做的差不多的题目,1267那道,分析和那道差不多。要注意的是100!,longlong不够,继续使用以前的高精度类。

    题目还有一个比较坑人的地方,没有告诉你m>=n,需要处理m<n的情况,就是直接输出个0。。。下面是笔者AC的代码,仅供参考

#include <iostream>

using namespace std;



const int MAX_LEN=1000;

int temp[MAX_LEN];



class bigNumber

{

public:

    bigNumber()

    {

        memset(number,0,sizeof(number));

        number[0]='0';

    }

    bigNumber(char *str)

    {

        memcpy(number,str,strlen(str)+1);

    }

    bigNumber(_int64 a)

    {

        int i=0;

        memset(number,0,sizeof(number));

        if(a==0)

            number[0]='0';

        else

        {

            while(a)

            {

                number[i++]=a%10+'0';

                a/=10;

            }

            _strrev(number);

        }

    }

    ~bigNumber()

    {

    }



    char* getNumber()

    {

        return number;

    }



    friend ostream& operator<<(ostream& output, bigNumber& t)

    {

        output<<t.getNumber();

        return output;

    }



    bigNumber& operator+(bigNumber& t)

    {

        bigNumber* a=strlen(this->getNumber())>strlen(t.getNumber())?this:&t;

        bigNumber* b=strlen(this->getNumber())>strlen(t.getNumber())?&t:this;

        bigNumber* c=new bigNumber();

        char *x=a->getNumber();

        char *y=b->getNumber();

        char *z=c->getNumber();

        int lenx=strlen(x);

        int leny=strlen(y);

        int i;

        int flag=0;

        for(i=0;i<leny;i++)

        {

            z[i]=(x[lenx-1-i]-'0')+(y[leny-1-i]-'0')+flag;

            flag=z[i]>9;

            z[i]=z[i]%10+'0';

        }

        for(;i<lenx;i++)

        {

            z[i]=(x[lenx-1-i]-'0')+flag;

            flag=z[i]>9;

            z[i]=z[i]%10+'0';

        }

        if(flag)

            z[i]='1';

        _strrev(z);

        return *c;

    }



    bigNumber& operator*(bigNumber& t)

    {

        bigNumber* c=new bigNumber();

        char *x=this->getNumber();

        char *y=t.getNumber();

        char *z=c->getNumber();

        int lenx=strlen(x);

        int leny=strlen(y);

        int i,j;

        memset(temp,0,sizeof(temp));

        for(i=0;i<lenx;i++)

            for(j=0;j<leny;j++)

                temp[i+j]+=(x[lenx-1-i]-'0')*(y[leny-1-j]-'0');

        for(i=0;(i<lenx+leny-1) || temp[i]>9;i++)

        {

            if(temp[i]>9)

                temp[i+1]+=temp[i]/10;

            z[i]=temp[i]%10+'0';

        }

        z[i]=temp[i]+'0';

        while(z[i]=='0')

            z[i--]=0;

        _strrev(z);

        return *c;

    }



    bigNumber& operator=(bigNumber& t)

    {

        memcpy(number,t.getNumber(),strlen(t.getNumber())+1);

        return *this;

    }



    bigNumber& operator=(char *str)

    {

        memcpy(number,str,strlen(str)+1);

        return *this;

    }

private:

    char number[MAX_LEN];

};



bigNumber t[101]={1,1};

bigNumber s[101][101]={1};



int main()

{

    int i,j,cas=1;

    for(i=2;i<=100;i++)

        t[i]=t[i-1]*bigNumber(i);



    for(i=1;i<=100;i++)

        for(j=0;j<=i;j++)

            if(j==0)

                s[i][0]=s[i-1][0];

            else if(i==j)

                s[i][i]=s[i][i-1];

            else

                s[i][j]=s[i][j-1]+s[i-1][j];

    while(cin>>i>>j &&(i||j))

    {

        cout<<"Test #"<<cas++<<":\n";

        if(i>=j)

            cout<<s[i][j]*t[i]*t[j]<<endl;

        else

            cout<<0<<endl;

    }

}

 

你可能感兴趣的:(简单)