Leetcode - Fraction to Recurring Decimal

本文探讨了整数运算中避免溢出的方法,并通过两个不同的实现方案将分数转换为小数形式,包括循环部分的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[分析]
[color=blue]处理int型整数运算时,为避免溢出,省事的做法就是内部转为long类型处理[/color],不然极可能在极值case上栽跟头,比如int a = Integer.MIN_VALUE, int b = -1 和 long a = Integer.MIN_VALUE, long b = -1, 两者a / b的结果是不一样的,前者会发生溢出,
在比如Math.abs(Integer.MIN_VALUE) 结果竟然是Integer_MIN_VALUE,这都是各种Wrong Answer耐心地告诉我的。
实现2参考[url]https://leetcode.com/discuss/23079/my-clean-java-solution[/url], 有条理的一步步构造出答案,觉得这种方式实现更不容易出错些,自己的实现1就犯过在判断符号后忘记讲intPart取绝对值导致的错误。


public class Solution {
// especially take care of case like -2147483648 / -1
// Method 2
public String fractionToDecimal(int numerator, int denominator) {
if (denominator == 0)
return "Error: divide zero.";
if (numerator == 0)
return "0";
StringBuilder res = new StringBuilder();
res.append((numerator > 0 ^ denominator > 0) ? "-" : "");
long a = Math.abs((long)numerator);
long b = Math.abs((long)denominator);
//integer part
res.append(a / b);
long mod = a % b;
if (mod == 0)
return res.toString();
//fraction part
res.append(".");
HashMap<Long, Integer> map = new HashMap<Long, Integer>();
map.put(mod, res.length());
while (mod != 0) {
mod *= 10;
res.append(mod / b);
mod %= b;
if (map.containsKey(mod)) {
res.insert(map.get(mod), "(");
res.append(")");
break;
} else {
map.put(mod, res.length());
}
}
return res.toString();
}
// Method 1
public String fractionToDecimal1(int numerator, int denominator) {
long a = numerator, b = denominator; // Attention!
if (b == 0) return "Divide zero exception.";
long intPart = a / b;
long mod = a % b;
if (mod == 0)
return String.valueOf(intPart);

boolean isNeg = (a > 0 ^ b > 0) ? true : false;
intPart = Math.abs(intPart);
mod = Math.abs(mod);
b = Math.abs(b);

HashMap<Long, Integer> map = new HashMap<Long, Integer>();
StringBuilder fractionPart = new StringBuilder();
int i = 0;
while (mod != 0 && !map.containsKey(mod)) {
map.put(mod, i++);
mod *= 10;
fractionPart.append(mod / b);
mod = mod % b;
}
if (mod == 0) {
return (isNeg ? "-" : "") + intPart + "." + fractionPart.toString();
} else {
int startRepeat = map.get(mod);
return (isNeg ? "-" : "") + intPart + "."
+ fractionPart.substring(0, startRepeat)
+ "(" + fractionPart.substring(startRepeat, fractionPart.length()) + ")";
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值