/*
题意:输入一个小数R,一个整数N,输出R^N
思路:将小数转换成整数然后求出R^N,然后判断出小数点的位置进行输出。
方法一通过,但是方法二我不知道那里有错误!只是输入方式不同而已,难道测试数据中存在空行?
*/
//方法一:
#include <cstdio>
#include <cstring>
const int nMax = 200;
struct BigNumber
{
int data[nMax];
int len;
BigNumber(){len = 1; memset(data, 0, sizeof(data));}
BigNumber(char *str){*this = str;}
BigNumber & operator=(char *str);
BigNumber operator*(int a);
void clearLeadZero();
};
BigNumber & BigNumber::operator=(char *str)
{
memset(data,0,sizeof(data));
len = strlen(str);
int i;
for(i = 0; i < len; ++ i)
data[i] = str[len - i - 1] - '0';
return *this;
}
BigNumber BigNumber::operator *(int a)
{
BigNumber z;
int i;
int q = 0;
for(i = 0; i < len + 10; ++ i)
{
int p = data[i] * a + q;
z.data[i] = p % 10;
q = p / 10;
}
z.len = i;
z.clearLeadZero();
return z;
}
void BigNumber::clearLeadZero()
{
while(len > 1 && !data[len - 1]) -- len;
}
void init(int &a, int &point, char *str)
{
int i;
a = 0;
point = -1;
for(i = 0; i < 6; ++ i)
{
if(str[i] == '.')
point = i;
else
a = a * 10 + str[i] - '0';
}
}
void solve(int a, int point, int N)
{
BigNumber ans = BigNumber("1");
int i;
for(i = 0; i < N; ++ i)
ans = ans * a;
point = 5 - point;
int m = (point == 6 ? 0 : point * N);//小数部分的位数
int j = 0;
while(!ans.data[j]) ++ j;//舍去尾部0
if(ans.len > m)
{
if(j >= m)//尾部0延伸到整数部分
{
for(i = ans.len - 1; i >= m; -- i)
printf("%d", ans.data[i]);
}
else
{
for(i = ans.len - 1; i >= m; -- i)
printf("%d", ans.data[i]);
printf(".");
for(i = m - 1; i >= j; -- i)
printf("%d", ans.data[i]);
}
}
else //求出后大整数的位数小于小数的位数
{
printf(".");
for(i = m - 1; i > ans.len - 1; -- i)
printf("0");
for(; i >= j; -- i)
printf("%d", ans.data[i]);
}
printf("\n");
}
int main()
{
freopen("f://data.in", "r", stdin);
char str[10];
int N;
while(scanf("%s%d",str,&N) != EOF)
{
int a,point;
init(a, point, str);
solve(a, point, N);
}
return 0;
}
//方法二:
#include <cstdio>
#include <cstring>
const int nMax = 200;
struct BigNumber
{
int data[nMax];
int len;
BigNumber(){len = 1; memset(data, 0, sizeof(data));}
BigNumber(char *str){*this = str;}
BigNumber & operator=(char *str);
BigNumber operator*(int a);
void clearLeadZero();
};
BigNumber & BigNumber::operator=(char *str)
{
memset(data,0,sizeof(data));
len = strlen(str);
int i;
for(i = 0; i < len; ++ i)
data[i] = str[len - i - 1] - '0';
return *this;
}
BigNumber BigNumber::operator *(int a)
{
BigNumber z;
int i;
int q = 0;
for(i = 0; i < len + 10; ++ i)
{
int p = data[i] * a + q;
z.data[i] = p % 10;
q = p / 10;
}
z.len = i;
z.clearLeadZero();
return z;
}
void BigNumber::clearLeadZero()
{
while(len > 1 && !data[len - 1]) -- len;
}
void init(int &a, int &point, int &N, char *line)
{
char str[10];
sscanf(line, "%s", str);//主要为了找错
int i;
a = 0;
point = -1;
for(i = 0; i < 6; ++ i)
{
if(str[i] == '.')
point = i;
else
a = a * 10 + str[i] - '0';
}
sscanf(line + 6,"%d",&N);
}
void solve(int a, int point, int N)
{
BigNumber ans = BigNumber("1");
int i;
for(i = 0; i < N; ++ i)
ans = ans * a;
point = 5 - point;
int m = (point == 6 ? 0 : point * N);//小数部分的位数
int j = 0;
while(!ans.data[j]) ++ j;//舍去尾部0
if(ans.len > m)
{
if(j >= m)//尾部0延伸到整数部分
{
for(i = ans.len - 1; i >= m; -- i)
printf("%d", ans.data[i]);
}
else
{
for(i = ans.len - 1; i >= m; -- i)
printf("%d", ans.data[i]);
printf(".");
for(i = m - 1; i >= j; -- i)
printf("%d", ans.data[i]);
}
}
else //求出后大整数的位数小于小数的位数
{
printf(".");
for(i = m - 1; i > ans.len - 1; -- i)
printf("0");
for(; i >= j; -- i)
printf("%d", ans.data[i]);
}
printf("\n");
}
int main()
{
freopen("f://data.in", "r", stdin);
char line[20];
while(gets(line))
{
int a,N,point;
init(a, point, N, line);
solve(a, point, N);
}
return 0;
}