166. Fraction to Recurring DecimalMedium

    xiaoxiao2021-03-25  65

    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)". 思路:我们首先知道,在做除法时,只要余数出现了重复的情况,最终结果就会是一个循环小数。我们使用deque来存储得到的每一个余数和商的每一位,并用hash表判断余数一旦出现了重复,就在重复的数开始加上括号。       注意本题的测试样例很大,因此要先将int转化为 long long int来计算,还要注意积为负数时加上负号。 class Solution { public: string fractionToDecimal(int numerator, int denominator) { string result = ""; deque<string>point; deque<string>quotient; if (numerator == 0) { return "0"; } if(denominator == 0) { return result; } if ((numerator < 0) ^ (denominator < 0)) { char symbol = '-'; result += symbol; } long long int up = abs(numerator); long long int down = abs(denominator); up = abs(up); down = abs(down); map<int,int>hash; long long int inte = up / down; cout << inte << endl; stringstream a; a << inte; string temp; a >> temp; result += temp; string q; bool flag = true; if (up % down == 0) { return result; } else { result += '.'; while (up % down != 0) { long long int i = up % down; if (hash[i] == 0) { hash[i] = 1; stringstream a; string t; a << i; a >> t; point.push_back(t); } else { stringstream a; a << i; a >> q; quotient.push_back(")"); point.push_back(")"); flag = false; break; } up = i * 10; long long int w = up / down; stringstream b; b << w; string e; b >> e; quotient.push_back(e); } } if (flag) { while (!quotient.empty()) { result += quotient.front(); quotient.pop_front(); } } else { while (!quotient.empty()) { if (q == point.front()) { result += "("; } result += quotient.front(); quotient.pop_front(); point.pop_front(); } } return result; } };

    转载请注明原文地址: https://ju.6miu.com/read-35934.html

    最新回复(0)