POJ#1001 我的想法很简单,把数字当作整数运算后再转化为小数。原理是(xx.x)^n=(xx.x*10)^n/10^n。要注意的就是高精度乘法的实现和输出时整数部分和小数部分的处理。下面附上还在WA中的代码,还在查错中,如果看官发现了错误还请提醒。。。
#include <stdio.h>
#define N 1000
int main(int argc, char *argv[])
{
int r,jin,i,j,k,f,len;//jin小数点位置
char input[5]={0},data[5]={0};
char temp[N]={0},mul,muler[N]={0};
while(scanf("%s%d",input,&r)!=EOF){
j=0,k=0,f=0;
for(i=0;i<3;i++)
if(input[i]=='.')
jin=5-i;
for(i=5;i>=0;i--){
if(i!=(5-jin)){
data[j]=input[i]-'0';
muler[j]=data[j];
j++;
}
else{
data[j]=input[i-1]-'0';
muler[j]=data[j];
i--; j++;
}
}
len=4;
for(i=0;i<r-1;i++) //*******高精度****************
{
for(j=0;j<5;j++){
mul=data[j];
f=j; //f为当前和的位置
for(k=0;k<len+2;k++){
temp[f]=mul*muler[k]+temp[f];
temp[f+1]=temp[f]/10+temp[f+1];
temp[f]=temp[f]%10;
f++;
}
}
temp[f]='a';
for(j=0;temp[j]!='a';j++)
len=j; //取temp长度
temp[f]=0;
for(j=0;j<len+1;j++){
muler[j]=temp[j];
temp[j]=0;
}
} //*****************************
for(i=len;i>(jin*r-1);i--){
muler[i+1]=muler[i];
}
muler[jin*r]='.'-'0';
for(i=len+1;i>=0;i--)
muler[i]=muler[i]+'0';
f=1,k=1;
for(i=len+1;i>jin*r;i--){
if(f){
if(muler[i]=='0')
f=1;
else{
printf("%c",muler[i]);
f=0;
}
}else
printf("%c",muler[i]);
}
for(i=0;i<jin*r;i++){
if(k){
if(muler[i]=='0')
k=1;
else{
k=0;
break;
}
}
}
for(j=jin*r;j>=i;j--)
printf("%c",muler[j]);
printf("\n");
for(i=0;i<=len+1;i++){
muler[i]=0;
temp[i]=0;
}
}
return 0;
}