把循环小数化为分数
来源:互联网 发布:票务平台源码 编辑:程序博客网 时间:2024/04/28 10:22
把循环小数化为分数
在计算机中,使用float或者double来存储小数是不能得到精确值的。如果你希望得到精确计算结果,最好是用分数形式来表示小数。有限小数或者无限循环小数都可以转化为分数。比如:
0.9 = 9/10
0.333(3)= 1/3(括号中的数字表示是循环节)
当然一个小数可以用好几种分数形式来表示。如:
0.333(3)= 1/3 = 3/9
给定一个有限小数或者无限循环小数,你能否以分母最小的分数形式来返回这个小数呢?如果输入为循环小数,循环节用括号标记出来。下面是一些可能的输入数据,如0.3、0.30、0.3(000)、0.3333(3333)、……
有限小数化为分数比较简单,下面重点分析如何把循环小数化为分数?
分析:看到这么一个题目,该如何下手呢?这也是困惑我的问题,怎么来解决这个循环的问题?所以问题的核心是如何搞定循环部分,找出是什么原因到这了这个循环的产生。
既然我们很容易解决有限小数,那么我们就从有限小数的转化入手,看看两者之间有什么联系,能否找到突破口,以分析0.3和0.3333(3333)为例。
第一种思路:找出什么原因导致循环(从一个我们能解决掉的简单例子入手)
0.3转化为分数是3/10,并且有3/10 < 0.3333(3333),那么接下来就是如何把3/10变大一点。有两种方法可以让它增大,一是分子增加x,分母不变,但这样最终结果还是有限小数;二是让分母减小x,分子不变,这就有可能变为循环小数,也就是:3/10→ 3/(10-x)。那么x应该是多少呢?看来这个问题找到了一点突破口了。先分析最简单的,取x=1。下面来做一下两者的计算过程:
由上面的计算过程可知,分母减少x,余数为3*x。在这里,我们只需要x为1,则余数与分子相等,这不又还原到了刚开始,所以导致不断的除下去。下面来分析另一个例子,0.003(3):
在这里x=100。
所以我们已经找到了产生循环的原因:使每次的余数是分子的10n(n>=0)倍。
如果遇见这种情况呢0.4354(4)呢?那好办,0.4354(4)=0.435+0.0004(4)
总结:在很多情况下,一个已经容易解决或者很相似的问题,往往能给我们当前的问题带来一些思路。所以当没有思路是,不妨从一个已经解决的问题入手。
思路二:去除循环部分(把无限变有限)
令Y=0. b1b2…bm,那么
10m *Y=b1b2…bm.(b1b2…bm)
10m *Y=b1b2…bm+0.(b1b2…bm)
10m *Y-Y=b1b2…bm
Y= b1b2…bm/(10m-1)
具体分析见:http://www.msra.cn/Articles/ArticleItem.aspx?Guid=9bd3f0ad-c5c0-4ad7-9750-d109377374b6#
- 把循环小数化为分数
- 把无限循环小数化为分数
- 把 分数化为循环小数 和 把循环小数化为分数 的方法
- 无限循环小数化为分数
- 把无限循环小数化为分数(转载,相当不错)
- 分数化为有限小数或无限循环小数(c实现)
- 循环小数转化为分数
- HDU1717循环小数化成分数
- 循环小数->分数备忘
- 分数化为小数
- 小数化为分数
- 无限循环小数的分数形式
- 将无限循环小数化成分数
- 无限循环小数转化为分数
- POJ1930,无限循环小数变分数
- 如何完成循环小数转成分数?
- 将无限循环小数写成分数
- 分数化为埃及分数 跨度为5
- 美国铁路工程师百年前预言多数应验
- 寒假刚开始的时候立一下志
- 火车票订票系统的几点优化思考 .
- 线程同步互斥锁和读写锁的区别
- WPF基础:依赖关系属性和通知
- 把循环小数化为分数
- js 在客户端操作文件的方法
- 模拟实现WPF的依赖属性及绑定通知机制(1)--依赖属性 .
- Android ICS来电话流程(FW层)
- 模拟实现WPF的依赖属性及绑定通知机制(2)--依赖对象的准备 .
- 工作代码片段-cmake
- 模拟实现WPF的依赖属性及绑定通知机制(3)--依赖对象
- 多线程模拟生产者消费者关系
- 模拟实现WPF的依赖属性及绑定通知机制(4)--模拟实现绑定连动机制 .