//算法:获得无小数点的输入串,然后对该串进行普通的高精度乘法运算 //运算得到结果后,添加小数点,最后除去串头和串尾的0即可 #include <stdio.h> #define MAXN 200 char R[10]; char E[6];//寄存无小数点的输入串 char temp[MAXN]; char ans[MAXN];//寄存答案串 int n,left; void multip(); int main(){ int i,j,k; int cnt; // freopen("data","r",stdin); while(scanf("%s%d",R,&n)==2){ left=MAXN-2;//数组最后一位保留,留着添加小数点 for(i=0,j=0;i<7;i++,j++){//取得去掉小数点的数字串 if(R[6-i]=='.'){ cnt=i-1; cnt*=n; j--; continue; } ans[left]=E[5-j]=temp[left]=R[6-i]; left--; } left++; for(i=1;i<n;i++)//进行普通的高精度乘法运算 multip(); for(i=0;i<cnt+1;i++)//添加小数点 ans[MAXN-1-i]=ans[MAXN-2-i]; ans[MAXN-1-i]='.'; while(ans[left]=='0')//去除串首的0 left++; i=0; while(ans[MAXN-2-i]=='0'){//去除串尾的0 ans[MAXN-2-i]=ans[MAXN-1-i]; i++; } if(ans[MAXN-2-i]=='.') ans[MAXN-2-i]=ans[MAXN-1-i];//无小数则去除小数点 printf("%s\n",ans+left); } return 0; } void multip(){//普通高精度乘法运算,结果存入temp,完成后复制回ans int i,j,k,pos,product,carry; int x_len,y_len; char *p=ans+left; x_len=strlen(p); y_len=strlen(E); k=left=MAXN-2;//数组最后一位保留 temp[MAXN-2]='\0'; for(i=0;i<MAXN-2;i++) temp[i]='0'; for(i=y_len-1;i>=0;i--){ k--; pos=k; carry=0; for(j=x_len-1;j>=0;j--){ product=(E[i]-'0')*(p[j]-'0')+temp[pos]-'0'+carry; temp[pos]=product%10+'0'; pos--; carry=product/10; } while(carry){ carry+=temp[pos]-'0'; temp[pos]=carry%10+'0'; pos--; carry/=10; } left=left<=pos+1?left:pos+1; } for(i=left;i<MAXN;i++) ans[i]=temp[i]; return; }
Exponentiation UVA 748,布布扣,bubuko.com
原文地址:http://blog.csdn.net/u011915301/article/details/38306795