分子除以分母,得到整数部分和余数。
如果余数为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;
}
}