Fraction to Recurring Decimal
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.
For example,
Given numerator = 1, denominator = 2, return "0.5".
Given numerator = 2, denominator = 1, return "2".
Given numerator = 2, denominator = 3, return "0.(6)".
Analysis
- Consider cases:
- numerator=0 (take care at first)
- sign: negative or positive (take care at first)
- overflow (cast numerator and denominator to long)
- repeating fractional part: keep a hashmap to record value and position
Code
public class Solution {
public String fractionToDecimal(int numerator, int denominator) {
if(numerator==0) {return "0";}
StringBuilder sb = new StringBuilder();
sb.append((numerator>0)^(denominator>0)?"-":"");
if(numerator/denominator<0) {sb.append("-");}
long num=Math.abs((long)numerator);
long den=Math.abs((long)denominator);
sb.append(num/den);
num%=den;
if(num==0){return sb.toString();}
sb.append(".");
HashMap<Long, Integer> map = new HashMap<Long, Integer>();
map.put(num, sb.length());
while(num!=0){
num*=10;
sb.append(num/den);
num%=den;
if(map.containsKey(num)){
sb.insert(map.get(num),"(");
sb.append(")");
return sb.toString();
}
else{
map.put(num,sb.length());
}
}
return sb.toString();
}
}
Note
- Concise way for sign assigning: sb.append((numerator>0)^(denominator>0)?"-":"")
- sb.append(int, long, double...), append string version of number to stringbuilder
Reference
Leetcode