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.
题意:
给定两个整数表示一个分数的分子和分母,返回字符串格式的分数。
如果小数部分是重复的,把重复部分写在括号中构成字符串。
提示:
只需要运用初等数学知识,要运用进行长除法。
尝试长除法的4 / 9,重复的部分是明显的。现在试4 / 333,能看长除法模式。
思路:
有以下几种情况:
- 如果可以直接除尽, 那么最好, 直接返回
- 如果不能直接除尽, 那么先取整数, 再计算小数. 计算小数部分时就是每次取商, 又可分为能除尽, 和循环小数
- 如果能除尽那么当最后可以整除的时候返回结果
- 比较麻烦的是循环小数. 我们需要将每次的被除数和当前商的位置用一个hash表存起来, 这样当某次发现相同的被除数时说明出现了循环, 那么就加在第一次出现这个被除数的商的位置加括号,并且在做运算的时候可能会越界, 因此我们要将除数和被除数都以long类型存储, 并且在运算之前将符号先提取出来。
1 | class Solution { |
扩展:
计算机原码、补码、反码知识。
1 | /*是int是4个字节表示,也就是32位.最高位是符号位,取值范围是:- 2 ^ 31-- - 2 ^ 31 - 1 |