LeetCode 166. 分数到小数
程序员文章站
2022-06-02 20:25:16
...
思路:
循环体出现的依据是,产生重复的余数,即每次mod*10 后再和 除数b计算出新余数,和之前的比较即可。
先对int型数据进行转换为long 以免int负数最小值化正越界
判定正负数, 结果是否加负号
求余数,若余数为0则直接返回
余数不为0,加入到map中,供下次检测。
每次将余数 和 对应sb的位置 存到map中
将mod*10 和 b计算出来的商追加到sb中,
并mod*10 % b再次计算新余数。循环直到mod==0
public static String fractionToDecimal(int numerator, int denominator) {
if(numerator==0)return "0";//若被除数为0直接返回
long a = numerator;//都转换为long 以免Integer.MIN_VALUE 转换为正数时 越界
long b = denominator;
boolean z = true;//判断是否是正数
if(a < 0){
z = !z;
a=-a;
}
if(b<0){//判断是否是正数
z=!z;
b=-b;
}
StringBuffer sb = new StringBuffer();//存储结果
if(!z){//若为负数,则追加 负号
sb.append("-");
}
sb.append(a/b);//先把商的整数部分追加到sb中
if(a%b==0){//若没有余数,则直接返回
return sb.toString();
}
long mod = a%b;//余数
sb.append(".");//最佳小数点
HashMap<Long,Integer> map = new HashMap<>();//键为 每次的余数 值为 对应的sb位置
while (mod != 0){
if(map.containsKey(mod)){//若包含余数key
sb.insert(map.get(mod),"(");//将( 插入到sb对应位置
sb.append(")");//后面追加 )
return sb.toString();//返回
}
map.put(mod,sb.length()); // 将新的余数 放入map中
mod*=10; // 余数*10
long shang = mod / b;//将商追加到sb末尾
sb.append(shang);
mod%=b; //计算新余数
}
return sb.toString();
}
推荐阅读