UVA 748 求幂

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

转一个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;
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值