166. Fraction to Recurring Decimal
来源:互联网 发布:电脑恢复手机数据 编辑:程序博客网 时间:2024/05/19 20:59
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)".
Hint:
- No scary math, just apply elementary math knowledge. Still remember how to perform a long division?
- Try a long division on 4/9, the repeating part is obvious. Now try 4/333. Do you see a pattern?
- Be wary of edge cases! List out as many test cases as you can think of and test your code thoroughly.
public class Solution { public String fractionToDecimal(int numerator, int denominator) { //Test Cases: 1,6; -50,8; -1,-2147483648; // convert int to long, in the case of -2147483648,-1, A will leak long numeratorLong = Long.valueOf(numerator); long denominatorLong = Long.valueOf(denominator); long A = Math.abs(numeratorLong/denominatorLong); //numeratorLong/denominatorLong could be 0, but the sign can be '-', for example: -1,6 String sign = numeratorLong*denominatorLong<0?"-":""; // to calculate tail (the part after '.'), both numerator and denominator need to be positive. String tail = helper(Math.abs(numeratorLong%denominatorLong),Math.abs(denominatorLong)); // in the case of 10,5, it should not return 2. but 2. return tail.equals("")? sign+Long.toString(A) : sign+Long.toString(A)+"."+tail; } String helper(long numerator,long denominator){ StringBuilder result= new StringBuilder(); //repeat part can be longer than 1, for example 1/7=0.(428571), so need a ArrayList to save all previous numerators ArrayList<Long> newNumerators = new ArrayList<Long>(); while(numerator!=0){ //in case of 7/180, result is 0, but numerator is 70 not 0, so while keep going; newNumerators.add(numerator); result.append(Long.toString(numerator*10/denominator)); numerator = (numerator*10)%denominator; for(int i=0; i<newNumerators.size(); i++){ //when find repeat numerator, means result also will repeat, no need to calculate, just add () and return if(numerator==newNumerators.get(i)){ result.insert(i,"("); result.append(")"); return result.toString(); } } } return result.toString(); }}
0 0
- 166. Fraction to Recurring Decimal
- 166. Fraction to Recurring Decimal
- 166. Fraction to Recurring Decimal
- 166. Fraction to Recurring Decimal
- 166. Fraction to Recurring Decimal
- 166. Fraction to Recurring Decimal
- 166. Fraction to Recurring Decimal
- 166. Fraction to Recurring Decimal
- 166. Fraction to Recurring Decimal
- 166. Fraction to Recurring Decimal
- 166. Fraction to Recurring Decimal
- 166. Fraction to Recurring Decimal
- 166. Fraction to Recurring Decimal
- 166. Fraction to Recurring Decimal
- 166. Fraction to Recurring Decimal
- 166. Fraction to Recurring Decimal
- 166. Fraction to Recurring Decimal
- 166. Fraction to Recurring Decimal
- Medium 40题 Combination Sum II
- Medium 216题 Combination Sum III
- 在Android学习中有关于广播注册的问题
- Tutorial 2:你好!点 (Hello dot! )
- 关于有序广播优先级问题
- 166. Fraction to Recurring Decimal
- 【scikit-learn algorithm cheat sheet】【汉化版】scikit-learn算法选择路径图
- 常规笔试算法 下部 应试版(笔试编程必考)
- Medium 377题 Combination Sum IV
- Medium 64题 Minimum Path Sum
- 常规笔试算法 上部 练习版(练习编程必做)
- PAT考试重点真题选做(尽量参考学习)
- Master-Worker设计模式
- 【软件】system.new.dat一键解包工具,支持Android5.1