PKU1001 求double型数字的n次方,即R^n,其中0.0 < R < 99.999,0 < n <= 25。 注:小于0的结果输出时小数点前不输出0;小数点后的多余0不输出 #include<stdio.h> #include<string.h> #include<stdlib.h> void Mult(char fal[],char a[],char b[])//大数乘法 { int i,j,len1,len2,afal[210]; len1=strlen(a); len2=strlen(b); memset(fal,0,sizeof(fal)); memset(afal,0,sizeof(afal)); for(i=len1-1;i>=0;i--) { for(j=len2-1;j>=0;j--) afal[len1+len2-i-j-2]+=(a[i]-'0')*(b[j]-'0'); } for(i=0;i<len1+len2;i++) { if(afal[i]>9) { afal[i+1]+=afal[i]/10; afal[i]=afal[i]%10; } } bool t=0; j=0; for(i=len1+len2;i>=0;i--) { if(t) fal[j++]=afal[i]+'0'; else if(afal[i]) { fal[j++]=afal[i]+'0'; t=1; } } fal[j]=0; if(t==0) strcpy(fal,"0"); } int main() { char a[100],b[100],c[110],d[250],fal[210]; int i,j,k,n,len,len1,len2,count; while(scanf("%s%d",a,&n)!=EOF) { //先取掉小数点后多余的0 j=0; len=strlen(a); for(i=len-1;i>=0;i--) if(a[i]!='0') { a[i+1]=0; break; } //count记录小数点的位数,并将a去掉小数点后的整数存在b中 len2=strlen(a); k=len2; bool t=0; for(i=0;a[i]!=0;i++) { if(t==1) { if(a[i]!='.') b[j++]=a[i]; else k=i+1; } else if(a[i]!='0') { if(a[i]!='.') b[j++]=a[i]; else k=i+1; t=1; } } b[j]=0; count=strlen(a)-k; strcpy(c,b); //进行大数乘法运算 for(i=2;i<=n;i++) { Mult(fal,b,c); strcpy(b,fal); } //将小数点补上,存在d中 count*=n; len1=strlen(b); if(count>=len1)//结果小于0的情况 { d[0]='.'; j=1; for(j=1;j<=count-len1;j++) d[j]='0'; for(i=0;b[i]!=0;i++) d[j++]=b[i]; d[j]=0; } else if(count==0) strcpy(d,b);//无小数点的情况 else //结果大于0的情况 { j=0;i=0; bool tt=0; while(b[i]!=0) { if(len1-count==i&&tt==0) { tt=1;d[j++]='.';} else d[j++]=b[i++]; } d[j]=0; } printf("%s/n",d); } return 0; }