转一个别人写的优秀代码 Octal Fractions(转自poj)
#include<cstdio> #include<cstring> char c[50]; int i,l; double x,y; int main() { while(scanf("%s",c)!=EOF) { printf("%s [8] = ",c); l=strlen(c)-1; x=0; y=1; for(i=l;i>1;i--) { x=((c[i]-'0')*y+x)*125; y*=1000; } x/=y; i=0; while(x) { c[i]=int(x*=10)%10+'0'; x-=c[i]-'0';i++; } c[i]='\0'; printf("0.%s [10]\n",c); } }
这个算法是将除法转变为乘法,对于0.d1d2d3 ... dk [8],本来是d1/8+d2/(8^2)+...+dk/(8^k),这个算法将 dn/8转变为 dn * 125,然后不断让 y 乘以 1000,起到保存小数位数的作用,最后的结果就相当于是 对dn每次乘以0.125。