LeetCode 166. Fraction to Recurring Decimal

来源:互联网 发布:游戏美工好找工作吗 编辑:程序博客网 时间:2024/06/05 14:30

LeetCode 166. Fraction to Recurring Decimal

问题来源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)”.

问题分析

这道题就是求除法,但是需要考虑循环小数的问题。那么如何考虑呢?

对于循环小数来说。余数肯定出现重复。这句话该怎么理解呢。

1/7 = 0.14285714285714

运算 结果 余数 1/7 0 1 10/7 1 3 30/7 4 2 20/7 2 6 60/7 8 4 40/7 3 5 50/7 7 1 10/7 1 3 30/7 4 2

从上面计算过程可以看出,余数1出现重复以后,后面的小数位都是重复的。所以保存余数,然后如果出现余数就说明开始了循环的过程。。考虑到对于给定denominator除数来说,可以初始化一个被除数数组。因为不能确定被除数最大是多少,这里我使用的是Map进行保存。

Java代码

public String fractionToDecimal(int numerator, int denominator) {    if(numerator==0) return "0";    boolean isP = true;    long number = numerator;    long de = denominator;    StringBuilder sb = new StringBuilder();    if(de*number<0) sb.append("-");    number=Math.abs(number);     de = Math.abs(de);    //首先计算整数部分    while(number>=de){        sb.append(number/de);        number = number%de;    }    if(number==0){        return sb.toString();    }    if(sb.length()<1||sb.charAt(sb.length()-1)=='-') sb.append("0");    //计算小数部分,小数部分要考虑小数的循环问题。小数的循环问题    Map<Long,Integer> map = new HashMap<>();    StringBuilder xiaosu  = new StringBuilder();    int index = 0;    while (number!=0){        if(map.containsKey(number)){            xiaosu.insert(map.get(number),"(");            xiaosu.append(")");            break;        }        map.put(number,index);        number*=10;        xiaosu.append(number/de);        number=number%de;        index++;    }    return sb.append(".").append(xiaosu).toString();}

LeetCode学习笔记持续更新

GitHub地址 https://github.com/yanqinghe/leetcode

CSDN博客地址 http://blog.csdn.net/yanqinghe123/article/category/7176678

原创粉丝点击