[ 滴滴笔试题 ] # 幂运算

题目: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;
	
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值