您的位置:首页 > 其它

[LeetCode] Fraction to Recurring Decimal 哈希表

2015-03-31 21:13 323 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: