题目来源:https://leetcode.com/problems/fraction-to-recurring-decimal/
问题描述
166. Fraction to Recurring Decimal
Medium
Given two integers representing the numerator and denominator of a fraction, return the fraction in string format.
If the fractional part is repeating, enclose the repeating part in parentheses.
Example 1:
Input: numerator = 1, denominator = 2
Output: "0.5"
Example 2:
Input: numerator = 2, denominator = 1
Output: "2"
Example 3:
Input: numerator = 2, denominator = 3
Output: "0.(6)"
------------------------------------------------------------
题意
给定分子和分母,求小数形式,要求将循环的小数位用括号括起来
------------------------------------------------------------
思路
难点:循环小数的判断
循环小数的每一位都是由当前分子整除分母得来的,求各个小数位的过程中,分母不变,当前分子不断乘10模分母,如果当前分子出现循环,则意味着小数位也出现循环
坑点:乘除法溢出int范围
使用long替代int
------------------------------------------------------------
代码
class Solution {
public String fractionToDecimal(int numerator, int denominator) {
if (numerator == 0) {
return "0";
}
StringBuilder sb = new StringBuilder();
if ((numerator < 0 && denominator > 0) ||(numerator > 0 && denominator < 0)) {
sb.append("-");
}
long numeratorL = numerator<0? -((long)numerator): ((long) numerator);
long denominatorL = denominator<0? -((long)denominator): ((long)denominator);
sb.append(numeratorL / denominatorL);
if (numeratorL % denominatorL == 0) {
return sb.toString();
}
sb.append(".");
numeratorL %= denominatorL;
HashMap<Long, Integer> map = new HashMap<Long, Integer>();
int cnt = sb.length();
map.put(numeratorL, cnt++);
while (numeratorL != 0) {
numeratorL *= 10;
sb.append(numeratorL / denominatorL);
numeratorL %= denominatorL;
if (map.containsKey(numeratorL)) {
sb.insert(map.get(numeratorL), "(");
sb.append(")");
break;
} else {
map.put(numeratorL, cnt++);
}
}
return sb.toString();
}
}