UVA 748 求幂

来源:互联网 发布:北京php工程师培训 编辑:程序博客网 时间:2024/06/04 18:42

以前百练写过,贼麻烦。。

转一个http://www.cnblogs.com/penseur/archive/2011/02/16/1956046.html

#include<iostream>#include<string>#include<cctype>using namespace std;//大数相乘string multiply(string str1,string str2){        char source[300][1000];        int len[300]={0};        if(str1=="0"||str2=="0")        {            return "0";        }        memset(source,'0',sizeof(source));        for(int i=0;i<300;i++)        len[i]=0;        char midstr1[300];        char midstr2[300];        int mstr1p=0;        int mstr2p=0;        memset(midstr1,'0',sizeof(midstr1));        memset(midstr2,'0',sizeof(midstr2));        int str1len=str1.size();        int str2len=str2.size();        for(int i=str1len-1;i>=0;i--)            midstr1[mstr1p++]=str1[i];        for(int i=str2len-1;i>=0;i--)            midstr2[mstr2p++]=str2[i];            //cout<<midstr1<<midstr2<<endl;        int space=0;        for(int i=0;i<mstr2p;i++)        {            char c=midstr2[i];            int addtion=0;            int d=c-'0';            int space=i;            for(int j=0;j<mstr1p;j++)            {                int one=midstr1[j]-'0';                int midmult=one*d+addtion;                addtion=midmult/10;                source[i][space++]=midmult%10+'0';            }            if(addtion>0)            source[i][space++]=addtion+'0';            len[i]=space;        }        //数值初始化完毕进行累加        char sum[1000];        memset(sum,'0',sizeof(sum));        int point=mstr2p-1;        int pflag=0;        int longs=0;        for(int i=899;i>=0;i--)        {            if(pflag)            {                sum[i]=source[point][i];            }            else            {                if(source[point][i]!='0')                {                    pflag=1;                    longs=i;                    sum[i]=source[point][i];                }            }            }        for(int i=0;i<point;i++)        {            int addtion=0;            for(int j=0;j<len[i];j++)            {                int one=source[i][j]-'0';                int midsum=one+addtion+sum[j]-'0';                addtion=midsum/10;                sum[j]=midsum%10+'0';             }            if(addtion>0)            {                for(int k=len[i];k<1000;k++)                {                    int midsum=sum[k]-'0'+addtion;                    addtion=midsum/10;                    sum[k]=midsum%10+'0';                    if(addtion==0)                    break;                }            }        }        char copysm[10000];        int cp=0;        memset(copysm,0,sizeof(copysm));        int flag=0;        for(int i=longs+12;i>=0;i--)        {            if(flag)            copysm[cp++]=sum[i];            else            {                if(sum[i]!='0')                {                    flag=1;                    copysm[cp++]=sum[i];                }            }        }        string str(copysm);        return str;}// 删除前导零。   void delLeadZero(string & a)   {       int i = 0;       while (a[i] == '0') i++;       if (i == a.size()) a = "0";       else a = a.substr(i, a.size() - i);   }  int main(){    string str;    while(getline(cin,str))    {        string left=str.substr(0,6);        string right=str.substr(7);        int nright=right[1]-'0';        if(right[0]!=' ')        nright=(right[0]-'0')*10+nright;        int pos=left.find('.');        int len=5-pos;        left.replace(pos,1,"");        delLeadZero(left);        string powers=left;        for(int i=0;i<nright-1;i++)        {          powers=multiply(powers,left);        }        int span=len*nright;        int plen=powers.size();        if(span<plen)        {            int st=plen-span;            powers.insert(st,".");        }        else         {            int st=span-plen;            cout<<".";            for(int i=0;i<st;i++)            cout<<"0";        }        deltrailZero(powers);        cout<<powers<<endl;    }    return 0;}