POJ_1001_Exponentiation

//使用int记录小数点的位置,使用string记录去掉小数点和尾零后的整数,例:
//95.123 记作 -3 与 "95123"
//1.0100 记作 -2 与 "101"
//110000 记作  4 与 "11"

#include<iostream>
#include<string>

using namespace std;

//输入数据的处理
void pre_treat(string &str, int &dot){
	if ((dot = str.find('.')) == string::npos) dot = 0;
	else{ str.erase(dot, 1); dot -= str.length(); }
	for (string::reverse_iterator r_it = str.rbegin();
		*r_it == '0'; str.erase((++r_it).base())) ++dot;
	for (string::iterator it = str.begin(); *it == '0'; str.erase(it));
}

//输出数据处理
string& last_treat(string &result, int r_dot){
	string temp;
	if (r_dot >= 0)
		result.append(r_dot, '0');
	else if (-r_dot <= result.length())
		result.insert(r_dot + result.length(), ".");
	else
		result = '.' + string(-r_dot - result.length(), '0') + result;
	return result;
}

//字符串整数的加法
string addition(const string &a,const string &b){
	int pa = a.length(), pb = b.length();
	int pc = pa > pb ? pa : pb;
	string c(pc, '0');
	int carry = 0, sum;
	for (--pa, --pb, --pc; pa >= 0 && pb >= 0; --pa, --pb, --pc){
		sum = a[pa] - '0' + b[pb] - '0' + carry;
		c[pc] += sum % 10; carry = sum / 10;
	}
	for (; pa >= 0; --pa, --pc){
		sum = a[pa] - '0' + carry;
		c[pc] += sum % 10; carry = sum / 10;
	}
	for (; pb >= 0; --pb, --pc){
		sum = b[pb] - '0' + carry;
		c[pc] += sum % 10; carry = sum / 10;
	}
	if (carry) c = '1' + c;
	return c;
}

//字符串整数与字符整数的乘法
string mutiply(const string &a, char c){
	int pa = a.length();
	int pb = pa + 1;
	string b(pb, '0');
	int cc = c - '0', carry = 0, sum;
	for (--pa, --pb; pa >= 0; --pa, --pb){
		sum = (a[pa] - '0')*cc + carry;
		b[pb] += sum % 10; carry = sum / 10;
	}
	if (carry) b[pb] += carry;
	else b.erase(string::iterator(b.begin()));
	return b;
}

//字符串整数与字符串整数的乘法
string mutiply(const string &a, const string &b){
	string c = "0";
	for (int pb = b.length() - 1, n = 0; pb >= 0; --pb, n++)
		c = addition(c, mutiply(a, b[pb]).append(n, '0'));
	return c;
}

int main(){
	int exp, dot, r_dot;//指数、输入小数点位置、输出小数点位置
	string str, result;
	while (cin >> str >> exp){
		pre_treat(str, dot);
		result = "1"; r_dot = 0;
		while (exp--){
			result = mutiply(result, str);
			r_dot += dot;
		}
		cout << last_treat(result, r_dot) << endl;
	}
	return 0;
}


import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.Scanner;

public class Main {
	static Scanner cin = new Scanner(System.in);
	static PrintWriter cout = new PrintWriter(System.out, true);

	public static void main(String[] args) 
	{
		BigDecimal a,c;
		int b;
		while (cin.hasNext()) 
		{
			a = cin.nextBigDecimal();
			b = cin.nextInt();
			c = a.pow(b);
			String ans = c.toPlainString();
			if (ans.contains(".") == false) 
			{
				cout.println(ans);
			} 
			else 
			{
				int x = 0, y = ans.length() - 1;
				while (ans.charAt(x) == '0') x++;
				while (ans.charAt(y) == '0') y--;
				if (ans.charAt(y) != '.') y++;
				cout.println(ans.substring(x, y));
			}

		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值