LeetCode Fraction to Recurring Decimal

来源:互联网 发布:wish产品优化 编辑:程序博客网 时间:2024/05/22 05:05

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;elsedenominator = -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));}}




0 0