貌似这是我的第一篇题解。
大概用了一天完成这道题。WA后看了网上提供的数据,发现漏了一点,然后0MS无压力AC了。
高精度幂无异于高精度乘法,只是多了浮点运算,但是很快就能想到先去掉小数点,最后输出时再加上去。
但是不能忘了
对小数点的特殊处理,例如:
输入: 10.000 1
输出: 10
如果不注意有可能输出为10. //<-注意这个多余的小数点。
//ps 对于POJ有一点很不解的是。。C++和G++居然是不一样的“语言”,而且C++不支持cin>>string = =
贴代码吧~详见注释~
1 #include <iostream> 2 #include <cstring> 3 4 using namespace std; 5 6 int main() { 7 string r; 8 int n; 9 while (cin>>r>>n) { 10 int i=1,p; 11 for (;i<6;i++) 12 if (r[i]=='.') 13 p=i;//找出小数点所在 14 r.erase(p,1);//先去掉小数点 15 string ans; 16 ans.resize(1024,0); 17 for (i=0;i<5;i++) 18 ans[i]=r[4-i]-48;//数字倒排 19 r=ans; 20 int l=5; 21 for (i=1;i<n;i++) { 22 string tmp; 23 tmp=ans; 24 ans=""; 25 ans.resize(1024,0); 26 for (int j=0;j<5;j++,l++) { 27 for (int k=0;k<l;k++) 28 ans[k+j]+=r[j]*tmp[k]; 29 for (int k=0;k<l;k++) 30 if (ans[k]>=10) { 31 if (k==l-1) 32 l++; 33 ans[k+1]+=ans[k]/10; 34 ans[k]%=10; 35 } 36 }//逐位相乘 注意进位 37 } 38 ans.insert(n*(5-p),1,'.');//插入小数点 39 int k=l; 40 while (0==ans[k]) --k; 41 int j=0; 42 while (0==ans[j]) ++j;//去掉首尾多余的零 43 if ('.'==ans[j]) ++j;//去掉多余的小数点 44 for (;k>=j;k--)ans[k]=='.'?cout<<'.':cout<<ans[k]-0;//最后正序输出 45 cout<<endl; 46 } 47 return 0; 48 }
转载于:https://blog.51cto.com/lsdsjy/1049322