热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LeetCode166:分数到循环小数的转换

给定两个整数,分别表示分数的分子和分母,返回该分数的小数形式。如果小数部分是循环的,则将循环部分括在括号内。

给定两个整数,分别表示分数的分子和分母,任务是返回该分数的小数形式。如果小数部分存在循环,则需要将循环部分用括号括起来。

例如:

示例 1:

输入: numerator = 1, denominator = 2
输出: "0.5"

示例 2:

输入: numerator = 2, denominator = 1
输出: "2"

示例 3:

输入: numerator = 2, denominator = 3
输出: "0.(6)"

问题解析:

本题的核心在于如何处理小数部分的循环。首先计算出分数的整数部分,然后通过模拟除法的过程来确定小数部分。在这个过程中,利用哈希表记录每次出现的余数及其位置,一旦发现相同的余数再次出现,即表明小数部分开始循环。

解决方案:

以下是Java语言实现的代码示例:

class Solution {    public String fractionToDecimal(int numerator, int denominator) {        if (numerator == 0) return "0";        if (numerator == Integer.MAX_VALUE && denominator == -1) return String.valueOf((double)numerator / (double)denominator);        long num = (long)numerator;        long den = (long)denominator;        boolean positive = true;        if (num * den <0) positive = false;        num = Math.abs(num);        den = Math.abs(den);        String pre = String.valueOf(num / den);        if (!positive) pre = '-' + pre;        long remain = num % den;        if (remain == 0) return pre;        HashMap m = new HashMap<>();        StringBuilder str = new StringBuilder();        int index = 0;        while (remain != 0 && !m.containsKey(remain)) {            str.append(String.valueOf((remain * 10) / den));            m.put(remain, index++);            remain = (remain * 10) % den;        }        if (remain == 0) return pre + '.' + str.toString();        else {            str.insert((int)m.get(remain), '(');            str.append(')');            return pre + '.' + str.toString();        }    }}

此代码首先处理特殊情况,如分子为0或溢出情况。接着,计算并处理符号,确保最终结果的正负正确。之后,通过循环和哈希表来检测并处理循环小数的情况。


推荐阅读
author-avatar
海边的石雨价_288
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有