题目描述:
计算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;
}