[LeetCode] 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)".

 

Credits:
Special thanks to @Shangrila for adding this problem and creating all test cases.

 

Hide Tags
  Hash Table Math
 
 
  题目其实挺容易的,需要考虑的是溢出问题,long int 长度是32 位的, long long int 才是64位。
 
#include <iostream>

#include <unordered_map>

#include <string>

#include <sstream>

using namespace std;



class Solution {

public:

    string fractionToDecimal(int numerator, int denominator) {

        bool flag1 = numerator<0;

        bool flag2 = denominator<0;

        unsigned numer = flag1?-numerator:numerator;

        unsigned denom = flag2?-denominator:denominator;



        if(denom==0)  return "";

        if(numer==0)    return "0";

        stringstream ss;

        ss<<numer/denom;

        string ret = ss.str();

        unsigned long long int lft = numer%denom;



        unordered_map<unsigned int,unsigned int> mp;

        string ret1="";

        unsigned int cnt = 1;

        while(lft){

            if(mp[lft]==0){

                mp[lft]=cnt++;

                ret1 += (lft*10)/denom + '0';

                lft = (lft*10)%denom;

                continue;

            }

            ret1 = ret1.substr(0,mp[lft]-1) + "(" + ret1.substr(mp[lft]-1) + ")";

            break;

        }

        if(ret1 != "")    ret += "." + ret1;

        if(flag1^flag2) ret = "-" + ret;

        return ret;

    }

};



int main()

{

    Solution sol;

    cout<<sol.fractionToDecimal(-1,-2147483648)<<endl;

    return 0;

}

 

你可能感兴趣的:(LeetCode)