lz才发现原来LeetCode的题目是会更新的,不错啊~
不过中间有几个大了标记的题目,点进去之后没有办法阅读题目,略蛋碎(ms要买什么书?,大家有好的解决方法求教)
回到这道题目,给出两个数字,分母和分子,求这个结果。结果要求:循环的数字要将循环节用括号包起来。
先说几点:
1、能够被整出的,要求分子分母divide greatest common dividor,分母的因子只有2和5,那么就是可以除尽的;否则就是无限循环,不可能是无限不循环(无理数了)。
2、判断无限循环的循环节,将分子不断*10,再找分母取模,当模数一样的时候,就是循环节
3、想法对了,但是这个精度和边界差点弄死我了……虽说给的是int,但是要考虑到long,然后去了倒数的话,Integer.MIN_VALUE的是超过double的精度的,要么循环暴力,好么就直接BigDecimal……为了做这个题目,也是很拼的……
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.HashMap;
public class Fraction_to_Recurring_Decimal {
public static String fractionToDecimal(int a, int b) {
long numerator = a;
long denominator = b;
if (numerator % denominator == 0)
return (numerator / denominator) + "";
String temp;
DecimalFormat format = (DecimalFormat) NumberFormat
.getPercentInstance();
format.applyPattern("#.###########################################");
String ret = "";
if (numerator * denominator < 0) {
System.out.println(numerator + " " + denominator);
ret = "-";
if (numerator < 0)
numerator = -numerator;
else
denominator = -denominator;
} else if (numerator < 0) {
numerator = -numerator;
denominator = -denominator;
}
long gcd = getGCD(numerator, denominator);
numerator = numerator / gcd;
denominator = denominator / gcd;
long num = denominator;
while (num % 2 == 0)
num /= 2;
while (num % 5 == 0)
num /= 5;
if (num == 1) {
BigDecimal bdNum = new BigDecimal(numerator);
BigDecimal bdDeno = new BigDecimal(denominator);
return ret + format.format(bdNum.divide(bdDeno));
} else {
long quotient = numerator / denominator;
long mod = numerator % denominator;
double d;
int index = 0;
HashMap<Long, Integer> map = new HashMap();
String current = "";
while (true) {
if (map.containsKey(mod)) {
int n = map.get(mod);
return ret + quotient + "." + current.substring(0, n) + "("
+ current.substring(n) + ")";
}
// System.out.println((1.0 * mod / denominator - mod
// / denominator));
d = 1.0 * mod / denominator - mod / denominator;
temp = format.format(d);
current = current + temp.charAt(2);
map.put(mod, index);
mod = mod * 10 % denominator;
index++;
}
}
}
public static long getGCD(long a, long b) {
long r;
if (a > b) {
r = a;
a = b;
b = r;
}
while (b != 0) {
r = b;
b = a % b;
a = r;
}
return a;
}
public static void main(String[] args) {
System.out.println(fractionToDecimal(1, 6));
// System.out.println(fractionToDecimal(1, 214748364));
System.out.println(fractionToDecimal(-1, -2147483648));
// System.out.println((1.0 * 1l / 2147483648l));
}
}