题目地址:点击打开链接
把浮点数当成整数来乘,最后再加上小数点即可。
C++代码:
#include <cstdio> #include <cstring> const int maxnum=100000; char s1[maxnum],s2[maxnum],ans[maxnum],temps[maxnum]; void add(char s[]) { int len_min=strlen(s)>strlen(ans)?strlen(ans):strlen(s); int len_max=strlen(s)<strlen(ans)?strlen(ans):strlen(s); int i; int c=0; for(i=0;i<len_min;++i) { int a=s[i]-'0'+ans[i]-'0'+c; ans[i]=a%10+'0'; c=a/10; } for(i=len_min;i<len_max;++i) { int a=s[i]+ans[i]-'0'+c; ans[i]=a%10+'0'; c=a/10; } if(c!=0) ans[i]=c+'0'; } void multi(char s1[],int x,int n) { memset(temps,0,sizeof(temps)); int c=0; int i; int len=strlen(s1); for(i=0;i<len;++i) { int a=(s1[i]-'0')*x+c; temps[i]=a%10+'0'; c=a/10; } if(c!=0) temps[len++]=c+'0'; for(i=len-1;i>=0;--i) temps[i+n]=temps[i]; for(i=0;i<n;++i) temps[i]='0'; add(temps); } void switch_str(char s[]) { int i=0; int j=strlen(s)-1; for(;i<j;++i,--j) { char c=s[i]; *(s+i)=s[j]; *(s+j)=c; } } int main() { char num1[100]; int n; int dot; while(scanf("%s %d",num1,&n)!=EOF) { memset(ans,0,sizeof(ans)); memset(s1,0,sizeof(s1)); memset(s2,0,sizeof(s2)); int i,j; dot=0; for(i=strlen(num1)-1;i>=0;--i) { if(num1[i]=='.') break; dot++; } if(i<0) dot=0; int flag=0; for(i=0;num1[i]!=0;++i) { if(num1[i]!='.') s1[i-flag]=num1[i]; else flag=1; } s1[i]=0; switch_str(s1); strcpy(s2,s1); strcpy(ans,s1); for(j=1;j<n;++j) { memset(s1,0,sizeof(s1)); strcpy(s1,ans); memset(ans,0,sizeof(ans)); for(i=0;i<(int)strlen(s2);++i) multi(s1,s2[i]-'0',i); } for(i=maxnum-1;i>=0&&(ans[i]==0||ans[i]=='0');--i) ans[i]=0; dot=dot*n; if(strlen(ans)<=dot) { printf("."); for(i=dot-1;i>strlen(ans)-1;--i) printf("0"); for(;i>=0;--i) printf("%c",ans[i]); printf("\n"); } else { for(i=strlen(ans)-1;i>dot-1;--i) printf("%c",ans[i]); flag=1; for(j=0;j<=i;++j) { if(ans[j]!='0') { flag=0; break; } } if(j>i) printf("\n"); else { printf("."); for(;i>=j;--i) printf("%c",ans[i]); printf("\n"); } } } return 0; }