分数小数的相互转换

发布时间:   来源:文档文库   
字号:
1、小数和分数的相互转换
1.1、小数化分数《编程之美》里面有
(1只考虑大于0、小于1的纯小数,且暂时不考虑分母和分子的约分,先将其表示成分数X=0.a1a2...anX=0.a1a2...an(b1b2...bm,其中a1a2...anb1b2...bm都是0-9的数字(b1b2...bm表示循环节。
一、对于有限小数,X=(a1a2...an/10n
二、对于无限循环小数X=0.a1a2...an(b1b2...bm,做如下转换:
10
n
*Xa1a2...an.(b1b2...bm=a1a2...an0.(b1b2...bm
X=(a1a2...an0.(b1b2...bm/10n(1.1
对于整数部分不需额外处理,只需把小数部分转化为分数形式在加上该整数即可。Y=0.(b1b2...b
m
(1.2
10m*Yb1b2...bm0.(b1b2...bmb1b2...bmY
10m*Y-Yb1b2...bmY(b1b2...bm/(10m1(1.3则式1.3代入式1.1X(a1a2...an(b1b2...bm/(10
X(a1a2...an*(10
m
m
-1/10
n

-1(b1b2...bm/(10
n
*(10
m
-1
(2对分子分母约分
对任意分数A/B=A/Gcd(A,B/B/Gcd(A,B,其中Gcd(A,BAB的公约数。例如:对于X=0.0124[64],m=2,n=4,X=(124*(10-164/((10再约分即可。1.2、分数化小数
任何数除以9,99,999所得的数就是以自己为循环的数。
1/9=0.111111111111111111112/99=0.121212121212
因此如果给定分数能将其化为被9,99,999整除的化话,那么它的分数表示也就出来了如果分母能整除25,化得化简到不能为止,从而1/45=0.2/9,然后进行如上的化简其实规则还是没变。如果是小数的话,取其整数部分记做a(0,小数部分b(.2分母(化简到了被999999整除)+1所得的0的个数记做n;
那么小数表示为0.a[(a+b*10^n]其中[]表示循环。a的位数如果不足n要在前面补足0考虑0.2/9,a=0,b=.2;n=1;0+.2*10^1=20的位数是1不用补零,得00[2]
2
2
-1*10=12340/990000
4

1234/990001)=1.234/99
2a=1,b=.234,n=2
3a的位数不足n,差一位,在前面补一个0,a=01,a+b*10^n=24.4;24.4,由于n=2;24得小数部分乘以10^240,加24=64,64,这样没有小数部分,得小数表示0.0124[64]
程序如下:
#defineMINI_D0.0000000001
intfraction1(longLnum1,longLnum2,char*pFraction{longintegerPart=0,infinitePart=0;longnum1=abs(Lnum1;longnum2=abs(Lnum2;intflag=0;//用于判断符号位longmaxFactor=-1;if((Lnum1^Lnum2<0{flag=-1;pFraction[0]='-';}if(num1%num2==0//能整除{sprintf(pFraction+1,"%d\n",num1/num2;return0;}if(num1>num2//化成整数+小数,整数部分存在变量integerPart{integerPart=num1/num2;num1=num1-integerPart*num2;}if(num1>1{inti=2;for(;i<=num1;i++//求最大公约数{if((num1%i==0&&(num2%i==0maxFactor=i;}if(maxFactor!=-1//约分,化成最简形式{num1=num1/maxFactor;num2=num2/maxFactor;}}doubletemp1=(doublenum1;intp2=0,p5=0;while((num2%2==0//如果分母能整除25则化简{num2/=2;temp1/=2;p2++;}while((num2%5==0{num2/=5;temp1/=5;p5++;}intmax=p2>p5?p2:p5;infinitePart=temp1*pow(10,max;if(num2==1{sprintf(pFraction+1,"%#8d.%.*d\n",integerPart,max,infinitePart;return1;}intk=1;for(;;k++//for循环用于找到整除num299999

{if(((int(pow(10,k-1%num2==0break;}intn=(pow(10,k-1/num2;temp1*=n;//分子分母同时乘以n,分母已化成k9的形式longintegerP2=(longtemp1;//提取分子的整数部分adoubletempInfinite=(temp1-integerP2*pow(10,k;//b*10^ktempInfinite+=integerP2;//a+b*10^klongtempInteger=integerP2;intinum=k;while(tempInfinite-(long(tempInfinite+MINI_D>MINI_D//a+b*10^k有小数部分则继续按上述方法循环{integerP2=integerP2*pow(10,k+(longtempInfinite;tempInfinite=(tempInfinite-(longtempInfinite*pow(10,k+(longtempInfinite;inum+=k;}infinitePart=(long(tempInfinite+MINI_D;sprintf(pFraction+1,"%#d.%.*d[%.*d]\n",integerPart,inum,integerP2,k,infinitePart;return1;}


本文来源:https://www.2haoxitong.net/k/doc/c4d41e1ea76e58fafab00329.html

《分数小数的相互转换.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式