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)".
Hint:
- No scary math, just apply elementary math knowledge. Still remember how to perform a long division?
- Try a long division on 4/9, the repeating part is obvious. Now try 4/333. Do you see a pattern?
- Be wary of edge cases! List out as many test cases as you can think of and test your code thoroughly.
public class Solution {
public String fractionToDecimal(int numerator, int denominator) {
//Test Cases: 1,6; -50,8; -1,-2147483648;
// convert int to long, in the case of -2147483648,-1, A will leak
long numeratorLong = Long.valueOf(numerator);
long denominatorLong = Long.valueOf(denominator);
long A = Math.abs(numeratorLong/denominatorLong);
//numeratorLong/denominatorLong could be 0, but the sign can be '-', for example: -1,6
String sign = numeratorLong*denominatorLong<0?"-":"";
// to calculate tail (the part after '.'), both numerator and denominator need to be positive.
String tail = helper(Math.abs(numeratorLong%denominatorLong),Math.abs(denominatorLong));
// in the case of 10,5, it should not return 2. but 2.
return tail.equals("")? sign+Long.toString(A) : sign+Long.toString(A)+"."+tail;
}
String helper(long numerator,long denominator){
StringBuilder result= new StringBuilder();
//repeat part can be longer than 1, for example 1/7=0.(428571), so need a ArrayList to save all previous numerators
ArrayList<Long> newNumerators = new ArrayList<Long>();
while(numerator!=0){
//in case of 7/180, result is 0, but numerator is 70 not 0, so while keep going;
newNumerators.add(numerator);
result.append(Long.toString(numerator*10/denominator));
numerator = (numerator*10)%denominator;
for(int i=0; i<newNumerators.size(); i++){
//when find repeat numerator, means result also will repeat, no need to calculate, just add () and return
if(numerator==newNumerators.get(i)){
result.insert(i,"(");
result.append(")");
return result.toString();
}
}
}
return result.toString();
}
}