hdu 1063 Exponentiation(有小数的高精)

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1063


注意处理好本题的边界问题。


代码如下:

#include<iostream>
#include<string>
#include<cstring>
using namespace std;
struct BigNum	
{
	int len;
	int piont;	//存小数点位置
	int num[10000];
	BigNum()
	{
		len = 1;
		piont = 0;
		memset(num, 0, sizeof(num));
	}
}number;

bool input()
{
	string s;
	if (cin >> s)
	{
		number.len = s.length();
		int k = 0;
		number.piont = 0;
		memset(number.num, 0, sizeof(number.num));
		for (int i = s.length() - 1; i >= 0; i--)
		{
			if (s[i] == '.')
			{
				number.piont = k;	//k==小数部分十分位位置+1
				number.len--;
				continue;
			}
			number.num[k++] = s[i] - '0';
		}
		return true;
	}
	return false;
}

BigNum BigMul(BigNum &x, BigNum & y)
{
	BigNum tempbn;
	for (int i = 0; i < x.len; i++)
	{
		for (int j = 0; j < y.len; j++)
		{
			int k = i + j;
			tempbn.num[k] += x.num[i] * y.num[j];
			if (tempbn.num[k] >= 10)
			{
				tempbn.num[k + 1] += tempbn.num[k] / 10;
				tempbn.num[k]%= 10;
			}
		}
	}
	tempbn.piont = x.piont + y.piont;		//小数点新的位置
	int l = x.len + y.len;		
	while (tempbn.num[l-1] == 0 && l > tempbn.piont&&l > 1)l--;//去掉整数部分无用的0
	tempbn.len=l;
	return tempbn;
}

void output(BigNum &ans)
{
	int right = 0;
	while (ans.num[right] == 0&&right<ans.piont) right++;
	if (ans.len == ans.piont)	//len==piont说明无整数部分
	{
		if (right == ans.piont)		//说明无小数部分
		{
			cout << 0 << endl; return;
		}
		else cout << '.';//输出‘.’  而不是“0.” 
	}
	for (int i = ans.len - 1; i >= right; i--)
	{
		cout << ans.num[i];
		if (ans.piont == i&&i!=right)	//注意当i==right时也不能输出‘.’
			cout << ".";
	}
	cout << endl;
}

int main()
{
	int n;
	while (input() && cin >> n)
	{
		BigNum ans;
		if (n == 0)
		{
			cout << 1 << endl;
			continue;
		}
		ans.num[0] = 1;
		while (n--)
		{
			ans = BigMul(ans, number);
		}
		output(ans);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值