/****************************************/ /*程序 pku1001*/ /*作者: S.Klaus */ /*日期:2005-7-5*/ /*调试:VC6*/ /**************************************** ****************************************/ /*头函数 */ #include<iostream.h>
#include<iomanip.h> #include<stdlib.h> #include<string.h> #define max 10000 /***************************************/ int xn(char fnum[],int n); int fmul(char s1[],char s2[]); /***************************************/ char sum[max]; char result[max]; /***************************************/ /*子函数计算两个数的乘积*/ int fmul(char s1[],char s2[]) { int ls1,ls2;//用于存储长度,进位信息 int i=0,j,p,q,m; int k=0,flag; char mid[max]; //char sum[max]; ls1=strlen(s1); ls2=strlen(s2); //反向 j=ls1-1; while(j>=0) { mid[i++]=s1[j--]; } mid[i]=s1[ls1]; strcpy(s1,mid); i=0; j=ls2-1; while(j>=0) { mid[i++]=s2[j--]; } mid[i]=s2[ls2]; strcpy(s2,mid); // cout<<s1<<endl<<s2<<endl; //计算 for(i=0;i<max;i++) { sum[i]='0'; } i=j=k=0; flag=0; p=0;q=0; while(s2[i]!='\0') { flag=0; m=q; for(m=0;m<q;m++) { mid[m]='0'; } p=m; while(s1[j]!='\0') { k=(s1[j]-'0')*(s2[i]-'0'); mid[p]=(flag+k)%10+'0'; flag=(flag+k)/10; j++;p++; } if(flag!=0){mid[p++]=flag+'0';} mid[p]='\0'; flag=0; p=0; //*********************************************/ if(i==0) { while(mid[p]!='\0') { sum[p]=mid[p]; p++; } } else { while(mid[p]!='\0') { k=(sum[p]-'0')+(mid[p]-'0'); sum[p]=(k+flag)%10+'0'; flag=(k+flag)/10; p++; } if(flag!=0) { sum[p++]=flag+'0'; flag=0; } } j=0; i++;q++; } sum[p]='\0'; i=0;j=0; strcpy(mid,sum); p-=1; while(p>=0) { sum[j]=mid[p]; p--; j++; } sum[j]='\0'; return 0; } /***************************************/ int xn(char fnum[],int n) { char s1[max]; int i; if(n==0) { strcpy(result,"1"); return 0; } for(i=0;i<max;i++) { result[i]='\0'; } strcpy(result,fnum); for(i=1;i<n;i++) { strcpy(s1,fnum); fmul(s1,result); strcpy(result,sum); } return 0; } /***************************************/ /***************************************/ /*主函数*/ int main() { char s1[max],s2[6]; int i; /*******************/ int n,ln,ls; char ch; int m,j=0,fl[100]; char s[6]; char res[100][max]; /*******************/ m=0; for(i=0;i<100;i++) fl[i]=0; while(cin>>s2>>n) { j=0; i=0; while(s2[i]!='\0') { if(s2[i]=='.') { ln=strlen(s2)-1-i; fl[m]=ln; } else { s[j++]=s2[i]; } i++; } s[j]='\0'; ln=ln*n; xn(s,n); ls=strlen(result); i=0; j=0; while(result[i]!='\0') { if(i==(ls-ln)) { res[m][j++]='.'; res[m][j++]=result[i++]; } else { res[m][j++]=result[i++]; } } res[m][j]='\0'; m++; } //去除多出的零 for(i=0;i<m;i++) { j=strlen(res[i])-1; while(j!=0&&fl[i]!=0) { if(res[i][j]!='0') { if(res[i][j]=='.') res[i][j]='\0'; else res[i][j+1]='\0'; break; } j--; } j=0; while(res[i][j]!='\0') { if(res[i][j]!='0') { while(res[i][j]!='\0') { cout<<res[i][j++]; } cout<<endl; break; } j++; } } return 0; }
|