//http://poj.org/problem?id=1001
//求浮点数的幂的精确值,R的n次方,R是实数(0.0<R<99.999),n是幂(0<n<=25)
大数据求幂
95.123 12
0.4321 20
5.1234 15
6.7592 9
98.999 10
1.0100 12548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
const int MAXN=1005;
struct BigInt
{
int e[MAXN],len;
int pis;//小数点位数
BigInt()
{
//将数组e的内容全部设置为0,memset函数通常是为新申请的内存做初始化工作
memset(e,0,sizeof(e));//它是对较大的结构体或数组进行清零操作的一种最快方法
len=0;
pis=0;
}
//去掉小数点,将字符数组倒序转换成整型数组。因为乘法竖式是按照后面来做乘法,所以倒过来要方便
void set(char s[])
{
int pp;//小数点位置,比如12.34,那么pp就是2
for(int i=0; s[i]; i++)
{
if(s[i]=='.')
{
pp=i;
break;
}
}
int l=strlen(s)-1;
pis=l-pp;//几位小数
for(int i=l; i>=0; i--)
{
if(s[i]=='.')
continue;
e[len++]=s[i]-'0';
}
while(e[len-1]==0&&len>1)
len--;
}
//重载*操作符
BigInt operator*(const BigInt& b)
{
BigInt res;
for(int i=0; i<len; i++)
{
int up=0;
for(int j=0; j<b.len; j++)
{
int z=(e[i]*b.e[j]+up+res.e[i+j]);
res.e[i+j]=z%10;//取模,取0~9一位数
up=z/10;//整除,进位
}
if(up!=0)
{
res.e[i+b.len]=up;
}
}
res.pis=pis+b.pis;
res.len=len+b.len;
while(res.e[res.len-1]==0&&res.len>1)
res.len--;
return res;
}
void print()
{
int limit=0;
while(e[limit]==0&&limit<pis)
limit++;//去后导0
if(pis>=len)
{
cout<<"0.";
for(int i=pis; i>len; i--)
{
cout<<0;//小数点后面填充0,0的数量为pis-len
}
for(int i=len-1; i>limit; i--)
{
cout<<e[i];
}
cout<<e[limit]<<endl;
}
else
{
for(int i=len-1; i>=pis; i--)//倒序输出整数部分
{
cout<<e[i];
}
if(limit<pis)
{
cout<<".";
for(int i=pis-1; i>limit; i--)//倒序输出小数部分
{
cout<<e[i];
}
cout<<e[limit]<<endl;
}
else
cout<<endl;
}
}
void print2()
{
for(int i=0; i<len-1; i++)
{
cout<<e[i];
}
cout<<e[len-1]<<endl;
}
};
char buf[MAXN]="1.0";
char a[MAXN],b[MAXN];
int n;
int main()
{
while(cin>>a>>n)
{
BigInt res,x;
res.set(buf);
x.set(a);
for(int i=0; i<n; i++)
{
res=res*x;
}
cout<<endl;
res.print();
//res.print2();
}
return 0;
}