leetcode解题方案--166--Fraction to Recurring Decimal

题目

Given two integers representing the numerator and denominator of a fraction, return the fraction in string format.

If the fractional part is repeating, enclose the repeating part in parentheses.

For example,

Given numerator = 1, denominator = 2, return “0.5”.
Given numerator = 2, denominator = 1, return “2”.
Given numerator = 2, denominator = 3, return “0.(6)”.

分析

考虑正负数
先计算整数部分
然后计算混循环小数部分
当除数不含2、5时
开始计算hashset纯循环小数部分

class Solution {
    public static String fractionToDecimal(int numerator1, int denominator1) {
        long numerator = numerator1;
        long denominator = denominator1;
        boolean neg = false;
        if (numerator<0) {
            neg = !neg;
            numerator = -numerator;
        }
        if (denominator<0) {
            neg = !neg;
            denominator = -denominator;
        }
        long inte = numerator/denominator;
        StringBuffer result = new StringBuffer(Long.toString(inte));
        if (neg && numerator!=0) {
            result.insert(0,"-");
        }
        numerator = numerator % denominator;
        if (numerator == 0) {
            return result.toString();
        }
        result.append(".");
        while (!isClean(denominator)) {
            numerator = numerator*10;
            long diff = getsml(numerator, denominator);
            numerator = numerator/diff;
            denominator = denominator/diff;
            result.append(Long.toString(numerator/denominator));
            numerator = numerator%denominator;
        }
        if (numerator == 0) {
            return result.toString();
        }
        result.append("(");

        long remain = numerator;
        HashSet<Long> hhh = new HashSet<>();
        while (!hhh.contains(remain)) {
            hhh.add(remain);
            remain = remain*10;
            result.append(remain/denominator);
            remain = remain%denominator;
        }
        System.out.print(neg);
        result.append(")");

        return result.toString();
    }
    private static boolean isClean(long num) {
        if (num%2==0 || num%5==0) {
            return false;
        } else {
            return true;
        }
    }
    private static long getsml(long num1, long num2) {
        if (num1>num2) {
            long tmp = num1;
            num1 = num2;
            num2 = tmp;
        }
        while (num2-num1!=0) {
            num2 = num2-num1;
            if (num1>num2) {
                long tmp = num1;
                num1 = num2;
                num2 = tmp;
            }
        }
        return num1;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值