题目:https://www.nowcoder.com/question/next?pid=12029438&qid=225676&tid=22097088
时间限制:1秒
空间限制:131072K
给定两个数R和n,输出R的n次方,其中0.0<R<99.999, 0<n<=25
输入描述:
多组测试用例,请参考例题的输入处理 输入每行一个浮点数 R 其中0.0 < R <99.999, 一个整数 n 其中0 < n <=25
输出描述:
输出R的n次方
输入例子1:
95.123 12 0.1 1
输出例子1:
548815620517731830194541.899025343415715973535967221869852721 0.1
分析:
浮点数幂运算,可以首先将小数点的位置找出,并把小数点去除,然后按照大数乘法运算即可。如下:
AC Code:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
string getStringMulti(string num1, string num2){
vector<int> ans(num1.size()+num2.size(),0);
for(int i=num1.size()-1;i>=0;--i){
int n1 = num1[i] - '0';
for(int j=num2.size()-1; j>=0; --j){
int n2 = num2[j] -'0';
ans[i+j+1] += n1*n2;
while(ans[i+j+1]>=10){
ans[i+j+1] -=10;
ans[i+j] +=1;
}
}
}
string res="";
while(ans.size()>1 && ans[0]==0){
ans.erase(ans.begin(),ans.begin()+1);
}
for(int i=0;i<ans.size();++i){
res += ans[i]+'0';
}
return res;
}
int main(){
string num1;
int num2;
while(cin>>num1>>num2){
auto idx = num1.find('.');
if(idx!=string::npos){
num1.erase(num1.begin()+idx,num1.begin()+idx+1);
}
string ans = num1;
for(int i=0;i<num2-1;i++){
ans = getStringMulti(ans,num1);
}
if(idx!=string::npos){
int n = (num1.size()-idx)*num2;
while(n>=ans.size()){
ans.insert(ans.begin(),'0');
}
ans.insert(ans.end()-n,'.');
auto lastZero = ans.find_last_not_of('0');
if(lastZero!=string::npos){
ans.erase(ans.begin()+lastZero+1,ans.end());
}
}
cout<<ans<<endl;
}
return 0;
}