幂运算

题目描述

小明的老师布置了一道幂运算题:一般情况下,计算机所能够处理的小数的范围和精度都是非常有限的。老师给出了一个小数a和指数b,让小明求abab。小明觉得手算非常麻烦,希望你能帮助他。

输入输出格式

输入格式:

共两行:

第一行是a,第二行是b。0<a<1000,a的长度不超过10位,保证这个数字有一个小数点,但不保证这个数字有整数部分或小数部分。比如可以用“.”代表0,但是这个数据不会出现。例如000.10会写成.10。1≤b≤25,为整数。

输出格式:

只有一行,即abab的结果。整数部分前面有0必须去掉,小数部分末尾有0也必须去掉。例如000.10100需要变为.101(整数部分为0也去掉)。输出部分必须有一个小数点。

输入输出样例

输入样例:
1.0100
12
输出样例: 1.126825030131969720661201
思路:去掉小数点,求出结果,再加回小数点。
代码:
//程序名:新的C++程序
//作者: 

#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>

using namespace std;
string times(string a1,string b1)
{
    int a[30001],b[30001],c[100001],la,lb,lc,z;
     string ans="";
     for(int i=1;i<=20000;i++)a[i]=b[i]=c[i]=0;
     la=a1.size();lb=b1.size();
     for(int i=0;i<=la-1;i++)a[la-i]=a1[i]-48;
     for(int i=0;i<=lb-1;i++)b[lb-i]=b1[i]-48;
     for(int i=1;i<=la;i++)
     {
            z=0;
            for(int j=1;j<=lb;j++)
            {
                c[i+j-1]=a[i]*b[j]+z+c[i+j-1];
                z=c[i+j-1]/10;
                c[i+j-1]%=10;
            }
           c[i+lb]=z;
     }
     lc=la+lb;
     while(c[lc]==0&&lc>1)lc--;
     for(int i=lc;i>=1;i--)ans+=c[i]+48;
     return ans;
}                   
string s,r,ans="1";
int x,n,l,w,y,z;
int main()
{
    cin>>s;
    cin>>n;
    y=s.size()-1;
    while(ans[y]=='0')y--;
    for(int i=0;;i++)if(s[i]=='.'){x=i;break;}else r+=s[i];
    for(int i=x+1;i<s.size();i++)r+=s[i];
    for(int i=1;i<=n;i++)ans=times(ans,r);
    z=r.size()-x;l=ans.size()-1;y=l;
    while(ans[l]=='0')l--;
    for(int i=0;i<=y+1-z*n-1;i++)cout<<ans[i];
    cout<<".";
    if(x==0){for(int i=1;i<=n-1;i++)cout<<0;for(int i=0;i<=l;i++)cout<<ans[i];}
    else for(int i=y+1-z*n;i<=l;i++)cout<<ans[i];
                                                                                                                                   
    

    return 0;
}
View Code

 

posted @ 2019-04-16 14:00  背‘水’一栈  阅读(265)  评论(0编辑  收藏  举报