题意:
给定两个整数a,b,一个除数一个被除数,得到结果,输出为字符串;
若结果为整数(2/1 = 2),则直接转成字符串 2;
若结果为小数(1/2 = 0.5),直接输出 0.5;
若结果为循环小数(2/3=0.6666)输出 0.(6),
分析:
若a%b==0,则说明结果为整数;
若不等于0,则可以分为两步:
首先取整除得到整数部分,然后取模,结果c,c*10/b得到小数部分第一位;(c*10 )%b得到新的c;接着下一轮直到出现重复的c,或者c为零结束;
出现重复的c说明会得到循环小数,出现c等于0,说明小数部分最终会结束;
http://www.programcreek.com/2014/03/leetcode-fraction-to-recurring-decimal-java/
public String fractionToDecimal(int numerator, int denominator) {
if (numerator == 0)
return "0";
if (denominator == 0)
return "";
String result = "";
// is result is negative
if ((numerator < 0) ^ (denominator < 0)) {
result += "-";
}
// convert int to long
long num = numerator, den = denominator;
num = Math.abs(num);
den = Math.abs(den);
// quotient
long res = num / den;
result += String.valueOf(res);
// if remainder is 0, return result
long remainder = (num % den) * 10;
if (remainder == 0)
return result;
// right-hand side of decimal point
HashMap<Long, Integer> map = new HashMap<Long, Integer>();
result += ".";
while (remainder != 0) {
// if digits repeat
if (map.containsKey(remainder)) {
int beg = map.get(remainder);
String part1 = result.substring(0, beg);
String part2 = result.substring(beg, result.length());
result = part1 + "(" + part2 + ")";
return result;
}
// continue
map.put(remainder, result.length());
res = remainder / den;
result += String.valueOf(res);
remainder = (remainder % den) * 10;
}
return result;
}