poj1001

//============================================================================
// Name        : 1001.cpp
// Author      : 
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <sstream>
using namespace std;

void integerToString(int i, string& str) {
	std::string s;
	std::stringstream out;
	out << i;
	str = out.str();
	string zero("0");
	while (str.length() < 6) {
		str =  zero+ str;
	}
}

class Exponentiation {
private:
	int n;
	string s;

	int integer;
	long long* result;
	int use;
	int tail;

public:
	Exponentiation(string& s, int n) {
		result = NULL;
		this->s = s;
		this->n = n;
		int index = s.find_first_of('.');
		string str = s.substr(0, index) + s.substr(index + 1, s.length());
		stringstream ss(str);
		ss >> integer;
		tail = n * (5 - index);
	}

	~Exponentiation() {
		if (result != NULL) {
			delete[] result;
		}
	}

	void calculate() {
		result = new long long[n + 1];
		result[0] = 1;
		use = 1;
		for (int i = 0; i < n; i++) {
			int mod = 0;
			for (int j = 0; j < use; j++) {
				result[j] = result[j] * integer + mod;
				mod = result[j] / 1000000;
				result[j] %= 1000000;
			}
			if (mod > 0) {
				result[use++] = mod;
			}
		}
	}

	void print() {
		string re;
		string out;
		string zero("0");
		for (int i = use - 1; i >= 0; i--){
			integerToString(result[i],out);
			re += out;
		}
		while (re.length() < tail + 1) {
			re = zero + re;
		}
		re = re.substr(0, re.length() - tail) + "."
				+ re.substr(re.length() - tail, re.length());

		int last = re.find_last_not_of('0');
		if (last != re.length()-1){
			re = re.substr(0,last+1);
		}

		int first = re.find_first_not_of('0');
		if (first>0){
			re = re.substr(first,re.length()-1);
		}

		if (re.at(re.length()-1)=='.'){
			re = re.substr(0,re.length()-1);
		}
		cout << re << endl;
	}

};

int main() {
	string s;
	int n;
	while (cin >> s >> n) {
		Exponentiation exp(s, n);
		exp.calculate();
		exp.print();
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值