当前位置: 代码迷 >> 综合 >> LeetCode 166 Fraction to Recurring Decimal
  详细解决方案

LeetCode 166 Fraction to Recurring Decimal

热度:20   发布时间:2024-01-19 14:27:25.0
分子除以分母,得到整数部分和余数。
如果余数为0,则直接返回整数部分的字符串形式。

如果余数不为0,则字符串开始为整数部分加小数点。

考虑到正负数相除的问题。如果分子分母一正一负,利用异或运算符判断,如果异或结果是true,则对分子分母取绝对值。
如果异或结果是false,则无需作处理。

另外,如果,分子特别大,而分母特别小,这样结果可能就会溢出int范围,所以在进行运算前,我们应该把数字转换为long类型。
class Solution {public String fractionToDecimal(int numerator, int denominator) {if(numerator == 0) return "0";if(denominator == 0) return String.valueOf(Integer.MAX_VALUE);String result = "";if((numerator<0)^(denominator<0))result += "-";long num = Math.abs((long)numerator);long den = Math.abs((long)denominator);long zs = num/den;//整数部分long ys = num % den;//余数部分result = result + String.valueOf(zs);if(ys == 0) return result;if(ys != 0) result += ".";Map<Long,Integer> map = new HashMap<Long,Integer>();int len = result.length();while(ys > 0){ys = ys * 10;zs = ys/den;//第一次进入while的时候,zs是小数点后的第一个数字if(map.containsKey(ys)){String part1 = result.substring(0,map.get(ys));String part2 = result.substring(map.get(ys));result = part1 +"("+part2+")";break;}else{result += String.valueOf(zs);//逐次拼接小数点后的数字map.put(ys,len);//第一次向map中存储的是第一次整除时的余数,此时与加了小数点后第一位数时的总长度对应。}len++;//第一次向map中存储的是第一次整除时的余数*10,此时与加了小数点后第一位数时的总长度-1对应。ys = ys % den;//更新余数}return result;}
}



  相关解决方案