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)”.
math类的问题肯定要考虑的就是 符号和overflow. 这里overflow直接用long解决
计算循环节的方法:如果出现已经出现过的余数,找到对应的index,到当前index之间的就是循环节
[code]
public class Solution {
public String fractionToDecimal(int numerator, int denominator) {
if(numerator==0)return new String("0");
if(denominator==0)return new String();
if(denominator==1)return String.valueOf(numerator);
HashMap<Long, Integer> map=new HashMap<Long, Integer>();
StringBuffer sb=new StringBuffer();
int sign= (numerator>0 && denominator>0) || (numerator<0 && denominator<0) ? 1:-1;
long num=Math.abs((long)numerator), den=Math.abs((long)denominator);
int point=-1;
map.put(num,-1);
while(num!=0)
{
if(num<den)
{
sb.append('0');
}
else
{
sb.append(String.valueOf((long)(num/den)));
num=num%den;
}
num*=10;
if(point==-1)point=sb.length();
if(map.containsKey(num))
{
sb.insert(map.get(num),"(");
sb.insert(point,'.');
sb.insert(sb.length(),')');
if(sign==-1)sb.insert(0,'-');
return sb.toString();
}
else
{
map.put(num, sb.length());
}
}
if(point<sb.length())sb.insert(point,'.');
if(sign==-1)sb.insert(0,'-');
return sb.toString();
}
}