重新开始战斗11-编程之美-精确表达浮点数

来源:互联网 发布:淘宝网通勤是什么意思 编辑:程序博客网 时间:2024/05/21 12:10

问题描述:

给定一个有限小数或无限循环小数,能否以分母最小的分数形式来返回这个小数。


问题分析:

在进行分析之前,先谈谈对这个题的思考方式。如何表示一个有限小数或无限循环小数,首先,无限循环小数的表达一定比有限小数更加复杂,所以应该从有限小数入手。其次,用分母最小的分数形式表示,如果没有这个限制条件,那么问题的求解也应该会变得简单。因此在解决这个问题的时候,应该从简到难。


对于有限小数:X=0.a1a2a3..an,在不考虑分母最小的情况下,其分数的表示很简单!即,如果要用分母最小的形式表示,则求10n和a1a2a3..an最大公约数问题。


对于无限循环小数:X=0.a1a2a3..an(b1b2b3..bm),其中括号内为循环部分,关于无限循环小数存在非循环节与循环节的问题,如果乘以10n,则可以将问题转为只含循环节的无限循环小数的问题上,这样又可以进一步简化问题。


那么对于X=0.a1a2a3..an( b1b2b3..bm),10nX=a1a2a3..an +0.( b1b2b3..bm);对于Y=0.( b1b2b3..am),

10mY = 0.( b1b2b3..bm)+b1b2b3..bm,进而,10mY-Y=b1b2b3..bm,所以Y= b1b2b3..bm/(10m-1)。带入得:

X=( a1a2a3..an+Y)/10n

 =( a1a2a3..an+ b1b2b3..bm/(10m-1))/10n

 =( a1a2a3..an*(10m-1)+(b1b2b3..bm))/((10m-1)*10n)

得到问题的解,然后退化为最大公约数问题。


0 0
原创粉丝点击