LeetCode Fraction to Recurring Decimal

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值