求能将小数转化为最近似分数的算法。解决思路
求能将小数转化为最近似分数的算法。
小弟想求教前辈下下,有什么算法能将小数转化为最分数哪?(分数要求是与小数的值最接近的值)
比如像25% =1/4这个很容易了,但62.9% = 7/11,或是47.6% = 5/11这个,应该是什么思路哪?
最好是通用性比较强的,能适应所有的小数。
请前辈指点,谢谢!
分不多了,有了分一定加上,谢谢。
------解决方案--------------------
有限数位的小数可以直接用百分数转化即可。比如62.9% = 629/1000。
如果是循环小数可以用级数求和的方式lim(n->∞)计算获得精确的分数形式。
比如0.11111111.....
可以写作an=10^-n,于是求和得到Sn=(1+0.1+0.01+...)-1,
Sn=a0*(1-10^-n)/(1-10^-1)-1
因为10^-n当n->∞时该项->0,可以忽略掉。
Sn = 1/(1-0.1)-1=10/(10-1)-1=1/9
所以0.11111111...=1/9
无限不循环小数是无理数,是不可以转化为有理数的分数形式的。明白了吧
------解决方案--------------------
连分数是你要的东西。
------解决方案--------------------
当然是连分式啊!
------解决方案--------------------
你看一下这个里面:http://topic.****.net/u/20110608/19/2b65f7c2-aa23-424e-a517-e60fc31d4787.html
实际上是一回事
------解决方案--------------------
//小数转换成分数
//对于无限循环小数 X=0.a1a2…an(b1b2…bm)来说,其复杂部分在于小数点
//后同时有非循环部分和循环部分,我们可以做如下的转换:
//X = 0.a1a2…an(b1b2…bm)
// 10^n* X= a1a2…an.(b1b2…bm)
// 10^n* X= a1a2…an+0.(b1b2…bm)
//X =(a1a2…an+0.(b1b2…bm))/10^n
//对于整数部分 a1a2…an,不需要做额外处理,只需要把小数部分转化为分数
//形式再加上这个整数即可。对于后面的无限循环部分,可以采用如下方式进行处理:
//令 Y=0. b1b2…bm,那么
//10^m *Y=b1b2…bm.(b1b2…bm)
// 10^m *Y=b1b2…bm+0.(b1b2…bm)
// 10^m *Y-Y=b1b2…bm
// Y= b1b2…bm /(10^m-1)
//将 Y 代入前面的X 的等式可得:
//X =(a1a2…an+Y)/10^n
//=(a1a2…an+ b1b2…bm/(10^m-1))/10^n
//=((a1a2…an)*(10^m-1)+ (b1b2…bm))/((10^m-1)*10^n)
------解决方案--------------------
编程之美一书中对此有比较详细的解答。
小弟想求教前辈下下,有什么算法能将小数转化为最分数哪?(分数要求是与小数的值最接近的值)
比如像25% =1/4这个很容易了,但62.9% = 7/11,或是47.6% = 5/11这个,应该是什么思路哪?
最好是通用性比较强的,能适应所有的小数。
请前辈指点,谢谢!
分不多了,有了分一定加上,谢谢。
------解决方案--------------------
有限数位的小数可以直接用百分数转化即可。比如62.9% = 629/1000。
如果是循环小数可以用级数求和的方式lim(n->∞)计算获得精确的分数形式。
比如0.11111111.....
可以写作an=10^-n,于是求和得到Sn=(1+0.1+0.01+...)-1,
Sn=a0*(1-10^-n)/(1-10^-1)-1
因为10^-n当n->∞时该项->0,可以忽略掉。
Sn = 1/(1-0.1)-1=10/(10-1)-1=1/9
所以0.11111111...=1/9
无限不循环小数是无理数,是不可以转化为有理数的分数形式的。明白了吧
------解决方案--------------------
连分数是你要的东西。
------解决方案--------------------
当然是连分式啊!
------解决方案--------------------
你看一下这个里面:http://topic.****.net/u/20110608/19/2b65f7c2-aa23-424e-a517-e60fc31d4787.html
实际上是一回事
------解决方案--------------------
//小数转换成分数
//对于无限循环小数 X=0.a1a2…an(b1b2…bm)来说,其复杂部分在于小数点
//后同时有非循环部分和循环部分,我们可以做如下的转换:
//X = 0.a1a2…an(b1b2…bm)
// 10^n* X= a1a2…an.(b1b2…bm)
// 10^n* X= a1a2…an+0.(b1b2…bm)
//X =(a1a2…an+0.(b1b2…bm))/10^n
//对于整数部分 a1a2…an,不需要做额外处理,只需要把小数部分转化为分数
//形式再加上这个整数即可。对于后面的无限循环部分,可以采用如下方式进行处理:
//令 Y=0. b1b2…bm,那么
//10^m *Y=b1b2…bm.(b1b2…bm)
// 10^m *Y=b1b2…bm+0.(b1b2…bm)
// 10^m *Y-Y=b1b2…bm
// Y= b1b2…bm /(10^m-1)
//将 Y 代入前面的X 的等式可得:
//X =(a1a2…an+Y)/10^n
//=(a1a2…an+ b1b2…bm/(10^m-1))/10^n
//=((a1a2…an)*(10^m-1)+ (b1b2…bm))/((10^m-1)*10^n)
------解决方案--------------------
编程之美一书中对此有比较详细的解答。