/** 大数(高精度)求幂 **/ //输入两个数字 m(可以带小数点),n,求m的n次方 #include<stdio.h> #include<string.h> #include<stdlib.h> char multiply[1000]; void multiplyer(char *a,char *b) //实质上就是俩个整型大数的乘法 { int i,j,num,tem; int multy[1000]= {0}; for(i=strlen(a)-1; i>=0; i--) for(j=strlen(b)-1,tem=strlen(a)-1-i; j>=0; j--,tem++) { num=(a[i]-'0'+0)*(b[j]-'0'+0)+multy[tem]; multy[tem]=num%10; multy[tem+1]+=num/10; } for(i=999; i>=0; i--) if(multy[i]) break; for(j=0; i>=0; i--) multiply[j++]=multy[i]+'0'; } int main() { char a[10]; int b,i,fcount,num,flag; while(scanf("%s %d",a,&b)!=EOF) { memset(multiply,0,sizeof(multiply)); for(i=0,num=0; i<=strlen(a)-1; i++) if(a[i]=='.') //需记录浮点数所在的位数 { fcount=strlen(a)-1-i; for(; i<=strlen(a)-1; i++) a[i]=a[i+1]; num=fcount*b; //记录小数点后数字的位数 break; } for(i=0; i<=strlen(a)-1; i++) if(a[i]!='0') break; for(fcount=0; i<=strlen(a); i++) a[fcount++]=a[i]; strcpy(multiply,a); b=b-1; while(b--) multiplyer(multiply,a); if(num<=strlen(multiply)) //根据补小数点的位置,需分情况讨论 { for(i=strlen(multiply)-1; i>=0; i--) if(multiply[i]!='0') { flag=i; break; } for(i=0; i<=strlen(multiply)-1; i++) { printf("%c",multiply[i]); if(i==strlen(multiply)-num-1) //浮点数求幂在相应位置上补小数点 { if(i==flag) //判断若是整数的幂次方,则不需要输出小数点而直接跳出 break; printf("."); } if(flag==i) break; } } else //若num>multily的位数,需要在小数点后补足相应位数的零 { for(i=strlen(multiply)-1; i>=0; i--) if(multiply[i]!='0') { multiply[i+1]='\0'; break; } printf("."); for(i=strlen(multiply); i<=num-1; i++) printf("0"); printf("%s",multiply); } puts(""); } return 0; }