作者:海边的石雨价_288 | 来源:互联网 | 2024-12-04 17:57
给定两个整数,分别表示分数的分子和分母,任务是返回该分数的小数形式。如果小数部分存在循环,则需要将循环部分用括号括起来。
例如:
示例 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或溢出情况。接着,计算并处理符号,确保最终结果的正负正确。之后,通过循环和哈希表来检测并处理循环小数的情况。