《编程之美》教你领略分数转小数的魅力
创作时间:
作者:
@小白创作中心
《编程之美》教你领略分数转小数的魅力
引用
CSDN
等
6
来源
1.
https://m.blog.csdn.net/2401_88154394/article/details/143580786
2.
https://m.blog.csdn.net/nirendao/article/details/136776869
3.
https://m.blog.csdn.net/u011438605/article/details/72770097?utm_source=blogxgwz1
4.
https://m.sohu.com/a/834805410_122077424/?pvid=000115_3w_a
5.
https://read.douban.com/ebook/1523295/?dcc=474698&dcm=works-guess
6.
https://leetcode.cn/problems/fraction-to-recurring-decimal/solutions/
分数转小数是数学中的基本运算,但在编程中却是一个充满挑战的问题。《编程之美》一书中,就详细探讨了如何通过编程实现分数到小数的转换,展示了这一过程中的数学之美。
基本方法:直接除法与长除法
最直观的方法是直接将分数的分子除以分母,得到小数结果。例如:
- ( \frac{3}{4} = 3 \div 4 = 0.75 )
- ( 2\frac{1}{2} = \frac{5}{2} = 5 \div 2 = 2.5 )
但对于一些分数,如 ( \frac{1}{3} ) 或 ( \frac{22}{7} ),直接除法会得到无限循环小数。这时就需要使用长除法来处理。
编程实现的关键技术
在编程中实现分数转小数,需要解决以下几个关键问题:
1. 循环小数的处理
对于无限循环小数,如 ( \frac{1}{3} = 0.333... ),我们需要能够识别循环节并正确表示。这通常通过模拟竖式除法的过程来实现。
2. 使用哈希表识别循环节
在长除法过程中,当余数重复出现时,就标志着循环节的开始。因此,我们可以使用哈希表(或字典)来记录每个余数出现的位置。一旦发现重复的余数,就可以确定循环节的起始位置。
3. 正负号和整数溢出的处理
由于分子和分母都可能是负数,我们需要在开始计算前判断结果的正负。此外,在计算过程中,需要将分子和分母转换为64位整数,以防止计算过程中的溢出。
具体实现步骤
以Java语言为例,以下是实现分数转小数的核心代码:
import java.util.HashMap;
import java.util.Map;
public class FractionToDecimal {
public String fractionToDecimal(int numerator, int denominator) {
long a = numerator, b = denominator;
boolean positive = (a >= 0 && b > 0) || (a <= 0 && b < 0);
if (a < 0) a = -a;
if (b < 0) b = -b;
long c = a / b;
long r = a - b * c;
if (r == 0) {
return positive ? Long.toString(c) : "-" + c;
}
int index = 0;
StringBuilder sb = new StringBuilder();
if (!positive) sb.append("-");
sb.append(Long.toString(c)).append(".");
Map<Long, Integer> remainderMap = new HashMap<>();
remainderMap.put(r, index);
while (true) {
a = r * 10;
c = a / b;
r = a - b * c;
sb.append(c);
index++;
if (r == 0 || remainderMap.containsKey(r)) break;
remainderMap.put(r, index);
}
if (r != 0) {
int firstLoopRemainderIndex = remainderMap.get(r);
sb.insert(firstLoopRemainderIndex + 2, "(").append(")");
}
return sb.toString();
}
}
实际应用案例
假设我们需要将分数 ( \frac{4}{333} ) 转换为小数:
- 首先判断符号:分子和分母都是正数,结果为正
- 计算整数部分:( 4 \div 333 = 0 )
- 开始长除法:
- 第一次:( 40 \div 333 = 0 ) 余 40
- 第二次:( 400 \div 333 = 1 ) 余 67
- 第三次:( 670 \div 333 = 2 ) 余 4
- 发现余数4重复,循环节开始
最终结果为:( 0.(012) )
总结
通过编程实现分数转小数,不仅需要掌握基本的数学原理,更需要巧妙地运用数据结构(如哈希表)来解决实际问题。这个过程充分体现了编程之美:将复杂的数学问题转化为简洁的代码,既考验逻辑思维,又需要对细节的精准把控。
无论是对编程感兴趣还是想深入了解数学知识的朋友,都能从这个过程中学到不少实用的知识点。
热门推荐
如何书写物业不作为的投诉信
血流漂杵说明只装备木制兵器?从出土文物,看商代中国军队青铜武器装备情况
初中英语语法详解:副词的位置
半月板三度损伤一定要做手术吗?深度解析:半月板三度损伤,手术还是保守治疗更合适?
老母鸡汤怎么炖好喝又营养
温和的洗发水:功效、误解与选择指南
56万字《孤勇:左宗棠新传》出版 刘江华:力争有新意有故事和真实可信
收藏!最全面的“引经药”讲解(附歌诀)
win11桌面存储路径从D盘改回C盘的方法介绍
因果报应:一种深植人心的社会信仰
宗教中的“因果报应”仅是文化心理现象,实际上不存在这种东西
建立人际关系网和你
Markdown 排版SSH 免密登入实践指南
规模化猪场的生物安全管理措施有哪些?
马桶出蓝色水怎么弄?解析问题及解决方案
癌症患者服用仑伐替尼好吗
牙疼服用甲硝唑期间饮酒的危害:可能引发严重双硫仑样反应
发烧烧“麻”了?警惕呼吸性碱中毒
挑选适合你的CPU:Intel vs AMD全面解析与推荐
《人民的名义》:大结局中的3个疑点,你看懂了吗?
如今社会,烧香拜佛,真的能改变一个人命运吗?
女性肝血管瘤的形成原因及治疗建议
DHCP动态分配地址,基于接口和全局模式。(最全详细过程)
基坑施工开挖要求
九球VS斯诺克:撞球界的终极对决,你更喜欢哪种比赛?
深入解析:如何正确定义数据寄存器以满足现代编程需求
詹姆斯攻防一体的秘密:湖人新阵容如何释放老詹潜能
入户门对着阳台的化解方法!
电视机路由器高级设置方法(优化网络连接)
【马桶安装】马桶怎么安装 马桶安装注意事项