题目链接: https://leetcode.com/problems/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)".
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.
思路: 有以下几种情况:
1. 如果可以直接除尽, 那么最好, 直接返回
2. 如果不能直接除尽, 那么先取整数, 再计算小数. 计算小数部分时就是每次取商, 又可分为能除尽, 和循环小数
1. 如果能除尽那么当最后可以整除的时候返回结果
2. 比较麻烦的是循环小数. 我们需要将每次的被除数和当前商的位置用一个hash表存起来, 这样当某次发现相同的
被除数时说明出现了循环, 那么就加在第一次出现这个被除数的商的位置加括号
并且在做运算的时候可能会越界, 因此我们要将除数和被除数都以long类型存储, 并且在运算之前将符号先提取出来.
写的我头好昏! ^.^
代码如下:
class Solution { public: string fractionToDecimal(int numerator, int denominator) { if(numerator == 0) return "0"; long m=labs(numerator), n=labs(denominator); unordered_map<int, int> hash; int k=numerator>0 ^ denominator>0, i = 0; string result; if(m % n == 0) return k==0?to_string(m/n):"-"+to_string(m/n); result = to_string(m/n) + "."; i = result.size(); m = m % n * 10; while(hash.find(m) == hash.end()) { hash[m] = i++; if(m % n ==0) { result += to_string(m/n); return k==0?result:"-"+result; } result += to_string(m/n); m = m%n*10; } result.insert(hash[m], 1, '('); result+= ")"; return k==0?result:"-"+result; } };
时间: 2024-10-13 12:15:06