问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

《编程之美》教你领略分数转小数的魅力

创作时间:
作者:
@小白创作中心

《编程之美》教你领略分数转小数的魅力

引用
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} ) 转换为小数:

  1. 首先判断符号:分子和分母都是正数,结果为正
  2. 计算整数部分:( 4 \div 333 = 0 )
  3. 开始长除法:
    • 第一次:( 40 \div 333 = 0 ) 余 40
    • 第二次:( 400 \div 333 = 1 ) 余 67
    • 第三次:( 670 \div 333 = 2 ) 余 4
    • 发现余数4重复,循环节开始

最终结果为:( 0.(012) )

总结

通过编程实现分数转小数,不仅需要掌握基本的数学原理,更需要巧妙地运用数据结构(如哈希表)来解决实际问题。这个过程充分体现了编程之美:将复杂的数学问题转化为简洁的代码,既考验逻辑思维,又需要对细节的精准把控。

无论是对编程感兴趣还是想深入了解数学知识的朋友,都能从这个过程中学到不少实用的知识点。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号