题目:
http://poj.org/problem?id=1001
主要是小数点没处理好,WA了好几次~~~
//思路:先撇开小数点不看,将其看做整数进行 乘幂,
//最后只要在相应位置添加小数点 . 就可以了
//结果的小数点的位置,小数点后面的数字有 (原来的小数个数*幂次) 个 (包括无用的0)
#include <stdio.h>
struct po {
int a[1111]; //保存 结果的每一位,一位一位存
}f;
int main()
{
char b[11];
int n,x,s,c;
int i,j,k;
//输入 底数b ,指数 n
while(scanf("%s%d",b,&n)!=EOF) {
s=x=0;
int dian; //记录小数点位置
//将其转换成 整型,并且记录小数点位置
for(i=0;b[i];i++)
if(b[i]=='.') dian=i;
else s=s*10+(b[i]-'0');
//特殊数, 0单独处理
if(s==0) {
puts("0"); continue;
}
x=i-1-dian; //计算小数点后面的数字个数 x
for(i=0;i<=1000;i++) f.a[i]=0;
f.a[0]=1; int m=0;
// 31~42 大数乘法
for(i=1;i<=n;i++) {
c=0;
for(j=0;j<=m;j++) {
f.a[j]=f.a[j]*s+c;
c=f.a[j]/10;
f.a[j]=f.a[j]%10;
}
while(c) {
f.a[++m]=c%10;
c/=10;
}
}
x=x*n; //记录:结果中小数点后面的位数
//排除后面无效的0,即 1.23000 排除后面的3个0
for(i=0;i<x&&f.a[i]==0;i++);
int y=i;
for(i=m;i>=x;i--)
printf("%d",f.a[i]);
if(i<y) goto l; //没有小数点的情况
printf(".");
//没有整除部分的情况,即数字很小
//如0.00050,我结构体里保存的只有50,没有前面的0
//(因为我是把小数先转换成整数进行乘的,所以没有前导的0)
//所以如果小数点位数大于转换成整数后计算出来的结果的位数时,
//要在前面补0了
if(m<x)
for(j=x-1;j>m;j--)
printf("0");
for(;i>=y;i--) //输出小数点后面的数
printf("%d",f.a[i]);
l:printf("/n");
}
}