现在的位置: 首页 > 综合 > 正文

POJ 1001 Exponentiation

2013年07月12日 ⁄ 综合 ⁄ 共 1409字 ⁄ 字号 评论关闭

题目描述:

计算R的n次方。如果计算的结果有前缀0,输出时将前缀0去掉。如果是小数点右半部分有后缀0,输出时同样去掉后缀0。

思路:

用字符串存储待计算的数及计算的结果。

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

/*
 * 返回两个大数相乘的结果
 */
string multiple(string a, string b)
{
	string result = "0", str;
	int i, j, remain, tmp, m, n;
	
	for(i = a.length() - 2; i >= 0; i--)
	{
		remain = 0;
		str = "";
		for(j = b.length() - 1; j >= 0; j--)
		{
			tmp = (a[i] & 0XF) * (b[j] & 0XF) + remain;
			remain = tmp / 10;
			str = (char)(tmp % 10 + '0') + str;
		}
		if(remain != 0)
		{
			str = (char)(remain + '0') + str;
		}

		tmp = 0;
		m = result.length() - (a.length() - i);
		n = str.length() - 1;
		remain = 0;
		while(m >= 0 && n >= 0)
		{
			tmp = (result[m] & 0XF) + (str[n] & 0XF) + remain;
			remain = tmp / 10;
			result[m] = (char)(tmp % 10 + '0');
			m--; n--;
		}

		while(m >= 0)
		{
			tmp = (result[m] & 0XF) + remain;
			remain = tmp / 10;
			result[m] = (char)(tmp % 10 + '0');
			m--;
		}

		while(n >= 0)
		{
			tmp = (str[n] & 0XF) + remain;
			remain = tmp / 10;
			result = (char)(tmp % 10 + '0') + result;
			n--;
		}

		if(remain != 0)
		{
			result = (char)(remain + '0') + result;
		}
	}

	return result;
}

int main()
{
	int c, n, i, j, pos, num;
	string str, res;

	while(cin >> str >> n)
	{
		res = "";
		pos = str.find_first_of(".");

		if(pos != string::npos)
		{
			str.erase(pos, 1);
		}
		num = str.length() - pos;

		if(n == 1)
		{
			res = str;
		}
		else
		{
			res = multiple(str, str);
			for(i = 2; i < n; i++)
			{
				res = multiple(res, str);
			}
		}

		if(pos == string::npos)
		{
			cout << res << endl;
			continue;
		}

		c = num * n;
		i = res.length() - 1;

		string s = "";
		while(c > 0 && i >= 0)
		{
			s = res[i--] + s;
			c--;
		}
		s = "." + s;

		for(j = 0; j <= i; j++)
		{
			if(res[j] != '0')
			{
				s = res.substr(j, i - j + 1) + s;
				break;
			}
		}

		for(i = s.length() - 1; i >= 0; i--)
		{
			if(s[i] == '0')
			{
				s.erase(i, 1);
			}
			else
			{
				break;
			}
		}
		if(s[s.length() - 1] == '.')
		{
			s.erase(s.length() - 1, 1);
		}

		cout << s << endl;
	}

	return 0;
}

抱歉!评论已关闭.