原题链接: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;
}