package com.interview.books.leetcodeoj;
import java.util.HashMap;
/**
* Created_By: stefanie
* Date: 14-12-30
* Time: 下午3:50
*/
public class LOJ166_FractionRecurringDecimal {
//use HashMap to store index of division of numerator in StringBuffer, if find existed numerator, make recurring
//1. numerator and denominator can be negative, need tracking flag and change using Math.abs()
//2. numerator and denominator can be out of range when do abs(), so need use Long
public String fractionToDecimal(int numerator, int denominator) {
if(numerator == 0) return "0";
boolean isPositive = (numerator > 0 && denominator > 0) || (numerator < 0 && denominator < 0);
long numeratorL = Math.abs((long) numerator);
long denominatorL = Math.abs((long) denominator);
StringBuffer buffer = new StringBuffer();
HashMap<Long, Integer> offsets = new HashMap();
buffer.append(numeratorL / denominatorL);
numeratorL = numeratorL % denominatorL;
if(numeratorL != 0) buffer.append(".");
while(numeratorL != 0){
if(offsets.containsKey(numeratorL)){
buffer.insert(offsets.get(numeratorL), "(");
buffer.append(")");
break;
}
offsets.put(numeratorL, buffer.length());
numeratorL = numeratorL * 10;
buffer.append(numeratorL / denominatorL);
numeratorL = numeratorL % denominatorL;
}
return isPositive? buffer.toString() : "-" + buffer.toString();
}
public static void main(String[] args){
LOJ166_FractionRecurringDecimal finder = new LOJ166_FractionRecurringDecimal();
// System.out.println(finder.fractionToDecimal(1, 2));
// System.out.println(finder.fractionToDecimal(2, 1));
// System.out.println(finder.fractionToDecimal(2, 3));
// System.out.println(finder.fractionToDecimal(1, 6));
System.out.println(finder.fractionToDecimal(1, 99));
System.out.println(finder.fractionToDecimal(0, -5));
System.out.println(finder.fractionToDecimal(-1, -2147483648));
}
}