需要注意对小数点的处理
#include<cstdio> #include<cstring> #include<stdlib.h> #include<cctype> #define MAX 600 #define LL strlen void jia(const char *str1,char *str)//add str1 to str { int len1=LL(str1); int c=0;len1--; for(int i=MAX-2;i>=0;i--) { if(len1>=0)str[i]+=str1[len1--]-‘0‘; str[i]+=c; c=(str[i]-‘0‘)/10; str[i]=(str[i]-‘0‘)%10+‘0‘; } str[MAX-1]=‘\0‘; } void cheng(const char *str1,const char *str2,char *str)//高精度乘法 { int len1=LL(str1),len2=LL(str2),i,j; char ch[MAX];int k=2; for(i=len1-1;i>=0;i--) { memset(ch,‘0‘,sizeof(ch));ch[MAX-1]=‘\0‘; int c=0,f=MAX-k;//c为进位所加的数,为最后一位的起始位 for(j=len2-1;j>=0;j--) { int temp=(str1[i]-‘0‘)*(str2[j]-‘0‘)+c; c=temp/10; ch[f--]=temp%10+‘0‘; } ch[f]+=c;int m=0; while(m<MAX-1&&ch[m]==‘0‘)m++; char s[MAX]; for(int p=0;m<MAX;m++,p++)s[p]=ch[m]; jia(s,str); k++;//进位 } str[MAX-1]=‘\0‘; } int main() { //freopen("input.txt","r",stdin); char temp[10],str1[10],num[10],str[MAX];int n; while(scanf("%s %d",temp,&n)!=EOF){ getchar();double t=atof(temp);//printf("t:%lf\n",t); int D=0;//小数点后面有几位 memset(str1,‘\0‘,sizeof(str1)); sprintf(str1,"%lf",t);//puts(str1); int i=-1,len=LL(str1),j=-1; memset(num,‘\0‘,sizeof(num));num[0]=0; if(strchr(str1,‘.‘)!=NULL){ int t=0; D=len-(strchr(str1,‘.‘)-str1)-1; while((str1[++j]==‘0‘||str1[j]==‘.‘)&&j<LL(str1)-1); for(i=j;i<len;i++)if(isdigit(str1[i]))num[t++]=str1[i]; //puts(num); if(n==0)printf("1\n"); else { char ch[MAX]; D*=n;memcpy(ch,num,sizeof(num)); for(int i=1;i<n;i++) { memset(str,‘0‘,sizeof(str)); cheng(num,ch,str); j=-1;while(str[++j]==‘0‘&&j<LL(str)-1); strcpy(ch,&str[j]);//下次相乘和保存结果 } int Len=LL(ch); if(Len<D+1){ //处理小数点 putchar(‘.‘); for(int index=1;index<=D-Len;index++)putchar(‘0‘); j=Len;while(ch[--j]==‘0‘&&j>0); for(int k=0;k<=j;k++)putchar(ch[k]); putchar(‘\n‘); } else { int k; for(k=0;k<Len-D;k++)putchar(ch[k]); j=Len;while(ch[--j]==‘0‘&&j>k-1); if(j>k)putchar(‘.‘); for(;k<=j;k++)putchar(ch[k]); putchar(‘\n‘); } } } } return 0; }
原文:http://blog.csdn.net/u013268685/article/details/20474525