小数乘法,先去掉小数点,然后得出结果再加上 time: 0ms #include<stdio.h> #include<string.h> #include<math.h> #define MAX 150 char s[7];int n,num[5],r1[MAX],r2[MAX]; int comput(int a,int len) { int i,j; memset(r2,0,sizeof(r2)); for(i = 0;i < len;i++) for(j = 0;j < a;j++) r2[i+j] += num[i]*r1[j]; for(i = 0;i < MAX-1;i++) if(r2[i]>=10) { r2[i+1] += r2[i]/10; r2[i] %= 10; } for(i = MAX-1;i>=0;i--) if(r2[i]!=0) break; for(j = 0;j < MAX;j++) r1[j] = r2[j]; return i+1; } int main() { int i,j,k,a,l,b,len; while(scanf("%s%d",s,&n)!=EOF) { j = 0;k = -1; memset(r1,0,sizeof(r1)); len = strlen(s)-1; for(i = len;i>=0;i--) { if(s[i]!='.') num[j++] = s[i]-'0'; else k = i; //小数点位置 } for(i = 0;i<j;i++) if(num[i]!=0) break; if(i == j && n!=0) { printf("0/n"); continue; } if(n==0) { printf("1/n"); continue; } if(k == -1) len++; for(i = 0;i < len;i++) r1[i] = num[i]; a = len; for(i = 1;i < n;i++) a = comput(a,len); if(k==-1) //计算的数是整数,就不考虑小数点 { for( l = a-1;l>=0;l--) //用来去掉头0 { if(r1[l]!=0) break; } for( i = l;i >=0;i--) printf("%d",r1[i]); printf("/n"); continue; } k = (len- k)*n; //小数点当前位置 j = k - a; if(j>=0) //小数点在数字之前 { printf("."); for(i = 0;i < j;i++) printf("0"); for(i = 0;i < MAX;i++) if(r1[i]!=0) break; for(b = a-1;b>=i;b--) printf("%d",r1[b]); printf("/n"); } else { for(i = 0;i < MAX;i++) //用来去掉尾0 { if(r1[i]!=0) break; } for( l = a-1;l>=0;l--) //用来去掉头0 { if(r1[l]!=0) break; } if(k <= i) //小数点在尾0之中 { for(b = l;b >= k;b--) printf("%d",r1[b]); } else //小数点在尾0之前 { for(b = l;b >= k;b--) printf("%d",r1[b]); printf("."); for(b = k-1;b >= i;b--) printf("%d",r1[b]); } printf("/n"); } } return 0; }