您的位置:首页 > 编程语言

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

2014-03-26 09:28 246 查看
问题描述:

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

问题分析:

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

对于有限小数: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)

得到问题的解,然后退化为最大公约数问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: