转一个别人写的优秀代码 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。

posted @ 2011-09-03 19:50  SunnyDay2015  阅读(373)  评论(0编辑  收藏  举报