一样的,用数组存储输入的数值,然后模拟乘法运算,输出的时候再加上小数点。
#include<stdio.h>
#include<string.h>
const int maxn=200;
char sr[maxn];
int n,r[maxn],ex[maxn],mul[maxn][maxn];
int main()
{
while(scanf("%s %d",sr,&n)!=EOF){
memset(ex,0,sizeof(ex));
memset(r,0,sizeof(r));
memset(mul,0,sizeof(mul));
int len=strlen(sr),p=0;
for(int i=len-1,j=0;i>=0;i--){
if(sr[i]!='.'){
r[j]=sr[i]-'0';
ex[j]=r[j];
j++;
}
else
p=i;
}
p=(len-p-1)*n; //计算运算完后有几位小数
for(int e=2;e<=n;e++){
for(int i=0;i<maxn;i++){
int c=0;
for(int j=0;j<maxn;j++){
int s=ex[j]*r[i]+c;
mul[i][j]=s%10;
c=s/10;
}
}
for(int i=1;i<maxn;i++){
int c=0;
for(int j=0,k=i;j<maxn;j++,k++){
int s=mul[0][k]+mul[i][j]+c;
mul[0][k]=s%10;
c=s/10;
}
}
for(int i=0;i<maxn;i++)
ex[i]=mul[0][i];
memset(mul,0,sizeof(mul));
}
int j;
for(j=maxn-1;j>=p;j--) if(ex[j]) break;//忽略整数部分前多余的0
int i;
for(i=0;i<p;i++) if(ex[i]) break; //忽略小数部分后多余的0
if(j==p-1&&i!=p){
printf(".");
for(int k=p-1;k>=i;k--) printf("%d",ex[k]);
}
else if(j!=p-1&&i==p){
for(int k=j;k>=p;k--) printf("%d",ex[k]);
printf(".");
}
/*else if(j==p-1&&i==p) //当结果为0时,此情况可忽略,因为题目中0.0<R<99.999
printf(".");*/
else if(j!=p-1&&i!=p){
for(int k=j;k>=p;k--) printf("%d",ex[k]);
printf(".");
for(int k=p-1;k>=i;k--) printf("%d",ex[k]);
}
printf("\n");
}
return 0;
}
--------------------------------------------------------------------------------------------
Keep It Simple,Stupid!
--------------------------------------------------------------------------------------------