幂运算
题目描述
小明的老师布置了一道幂运算题:一般情况下,计算机所能够处理的小数的范围和精度都是非常有限的。老师给出了一个小数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
思路:去掉小数点,求出结果,再加回小数点。
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//程序名:新的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; }