北大acm1001

题目链接:http://poj.org/problem?id=1001

Source Code

Problem: 1001   User: yuanting0505
Memory: 256K   Time: 0MS
Language: C++   Result: Accepted
    • Source Code
#include <iostream>

#include <iomanip>

#include <string>

using namespace std;



classbig_float

{

private:

    int num[200];//6^25 最多150位

    int pos;//pos为小数点位置

    int length;//长度

public:

   // big_float input_float(char *);//把输入的浮点数转化成 big_float型

    big_float input_float(char *in){

        big_float new_create;

        new_create.pos=0;

        new_create.length=0;

        memset(new_create.num,0,sizeof(new_create.num));//各位置零

        int i=0;

        int len=0;

        int length=(int)strlen(in);

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

        {

            if(in[length-1-i]=='.')//from back

            {

                new_create.pos=i;

            }

            else

            {

                new_create.num[len]=in[length-1-i]-'0';//不是num[i]啊啊啊啊

                //减去0的ascll码,效果跟(int)(in[length-1-i])一样吧。。。

                len++;

            }

        }

        new_create.length=len;

        return new_create;

    }

    big_float a_b(big_float a,big_float b )//计算a*b

    {

        big_float c;//c用来存储计算结果

        c.pos=a.pos+b.pos;//小数点

        c.length=a.length+b.length;

        memset(c.num,0,sizeof(c.num));

        int i=0;

        int j=0;

        for(i=0;i<a.length;i++)//先乘

        {

            for(j=0;j<b.length;j++)

            {

                c.num[i+j]+=a.num[i]*b.num[j];

            }

        }

        //进位

        for(int k=0;k<c.length;k++)

        {

            if (c.num[k]>9)

            {

                c.num[k+1]+=c.num[k]/10;

                c.num[k]%=10;

                while(c.num[c.length])//进位进到了最高位

                    c.length++;

            }

        }

        return c;

    }

    void r_n(big_float r,int n)//计算r^n次

    {

        big_float t;

        if(n==0)

        {

            cout<<1;

        }

        else if(n==1)

        {

            r.print_float();

        }

        else

        {

            int i=0;

            t=t.a_b(r, r);

            for(i=0;i<n-2;i++)

            {

                t=t.a_b(t,r);

            }

            t.print_float();

        }

    }

    void print_float()//按要求打印a

    {

        int i=0;

        int j=0;

        while((this->num[j]==0)&&(j<pos)){//小数点之后的0可以去掉

            j++;

        }

        while((this->num[this->length-1-i]==0)&&(this->length-i>pos)){//小数点之前的0可以去掉

            i++;

        }

        /* 输出有问题 length和实际长度不一致的时候会出错

        if(this->length-i<=pos)//说明数为.34343 这种类型

        {

            cout<<'.';

            for(int k=i;k<this->length-j;k++)//打出i到j

            {

                cout<<this->num[this->length-k-1];

            }

        }

        else if(j>=pos)//数为432.这种类型

        {

            for(int k=i;k<this->length-j;k++)

            {

                cout<<this->num[this->length-k-1];

            }

        }

        else

        {

            int k=0;

            for(k=i;k<this->length-pos+i-j;k++)

            {

                cout<<this->num[this->length-k-1];

            }

            cout<<'.';

            for(k=this->length-pos+i-j;k<this->length-j;k++)

            {

                cout<<this->num[this->length-k-1];

            }

        }

        cout<<endl;

         */

        for(;i<this->length-j;i++)

        {

            if((this->length-i)==this->pos)

            {

                cout<<'.';

                cout<<this->num[length-1-i];

            }

            else{

                cout<<this->num[length-1-i];

            }

            

        }

        cout<<endl;

    }

};









int main(int argc, const char * argv[])

{

    char *input=new char[10];

    int n;

    while( cin>>input>>n)

    {

        big_float input_num;

        input_num=input_num.input_float(input);

        big_float result;

        result.r_n(input_num, n);

    }

}

你可能感兴趣的:(ACM)