http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25197
给定一个浮点数a,求a的n次方的精确值,并且忽略前导0和后面多余的0.
用一个结构体保存浮点数a去掉小数点后的值,同时记录小数的位数,然后用大数乘法,来代替a的n次幂,求出精确值。
#include<cstdio>
#include<cstring>
struct node
{
int len;
int num[1000];
node() {memset(num,0,sizeof(num));len=0;} //构造函数 每次定义一个结构体变量就自动执行
};
node solve(node x1,node x2) //大数乘法
{
int i,j;
node x3;
for(i=0;i<x1.len;i++)
{
for(j=0;j<x2.len;j++)
{
x3.num[i+j]=x1.num[i]*x2.num[j]+x3.num[i+j];
x3.num[i+j+1]=x3.num[i+j+1]+x3.num[i+j]/10;
x3.num[i+j]=x3.num[i+j]%10;
}
}
i=x1.len+x2.len;
while(!x3.num[i]) i--;
x3.len=i+1; //注意要确定乘出来之后的位数
return x3;
}
int main()
{
//freopen("a.txt","r",stdin);
char s[100],ss[100];
int n,i,j;
while(~scanf("%s %d",s,&n))
{
int l=strlen(s);
int ans=0,m=0;
node p1,p2;
memset(ss,'\0',sizeof(ss));
j=0;
for(i=0;i<l;i++)
{
if(s[i]!='.') ss[j++]=s[i]; //去掉小数点
else ans=l-i-1; //同时记录小数点的位置
}
for(i=0;i<j;i++)
{
p1.num[p1.len++]=ss[j-i-1]-'0'; //数组转换为字符串
}
p2=p1; //结构体复制 浅复制
for(i=1;i<n;i++) //p的n次幂
{
p2=solve(p1,p2);
}
i=l*n; //最多有多少位
ans*=n; //小数的位数
//printf("%d %d\n",ans,i);
while(!p2.num[i]&&i>=ans) i--; //确定小数点的位置
if(i==ans-1)
{
printf(".");
for(j=0;j<i;j++) //忽略后面多余的0
if(p2.num[j]) break;
for(;i>=j;i--)
{
printf("%d",p2.num[i]);
}
printf("\n");
}
else
{
for(j=0;j<i;j++)
if(p2.num[j]) break;
for(;i>=j;i--)
{
if(i==ans-1) printf(".");
printf("%d",p2.num[i]);
}
printf("\n");
}
}
return 0;
}