题目要求如下:
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)".
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
string retVal = "";
long long nr = numerator;
long long dr = denominator;
if ((nr < 0 && dr > 0) || (nr > 0 && dr < 0))
retVal += "-";
if (nr < 0)
nr = - nr;
if (dr < 0)
dr = -dr;
retVal += to_string(nr/dr);
unordered_map<int, int> num_map; /* first is numerator, second is posision */
unordered_map<int, int>::iterator it;
nr = nr % dr;
if (nr != 0)
retVal += ".";
int pos = retVal.length();
while (nr != 0) {
nr = nr * 10;
it = num_map.find(nr);
if (it != num_map.end()) {
/* find it */
retVal.insert(it->second,"(");
retVal += ")";
break;
}
else {
num_map[nr] = pos;
retVal += to_string(nr/dr);
}
nr = nr % dr;
++pos;
}
return retVal;
}
};
算法描述:
1,构建hashmap<int, int>第一个参数是numerator,第二个参数是position.
2,举一个计算过程的例子,numerator简称为n, denominator简称为d,
n = 20, d = 11,这样计算记过应该是1.8181818->1.(81)
计算过程:
整数部分n/d=1,然后n = n % d = 9,此时因为n还大于0,所以要继续计算,并加上小数点,
此时n = n * 10 = 90,进入循环,n % d = 2,将其插入hashmap,其值等于位置,即第三位(2),
string的小数点后面加上n/d = 8,
进入下一个循环,n = n * 10 = 20,n % d = 9,将其插入hashmap,string后加上(n/d=1),
下一个循环,n = n * 10 = 90,n%d = 2,此时搜索hashmap,发现曾经出现过2,证明出现了循环,括号开始位为2的对应值,结束位为当前的位。
发发牢骚:
感觉自己差的知识好多。。。什么backtracking, dynamically programming都没有接触过,准备选下coursera算法课,巩固一下。。。
这道题在11月的时候又做了一遍,这次思路还是一样,不过代码风格还是有点区别,上传下新版本吧:
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
if (numerator == 0) {
return "0";
}
bool flag = false;
if ((numerator < 0 and denominator < 0) or (numerator > 0 and denominator > 0)) {
flag = true;
}
long n = abs(static_cast<long>(numerator));
long d = abs(static_cast<long>(denominator));
cout << n << endl;
string ret = "";
unordered_map<long, int> hashmap;
long Int = n / d;
n %= d;
int i = 0;
while (n != 0) {
auto found = hashmap.find(n);
if (found != hashmap.end()) {
ret.insert(hashmap[n], "(");
ret += ")";
break;
}
hashmap[n] = i++;
n *= 10;
int tmp = n / d;
ret += to_string(tmp);
n %= d;
}
ret = ret.empty() ? to_string(Int) : to_string(Int) + "." + ret;
return flag ? ret : "-" + ret;
}
};