Fraction to Recurring Decimal leetcode
2016-01-22 20:05
232 查看
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.
Subscribe to see which companies asked this question
这个题的思路简单,
1.根据两个数得到结果正负,如负数,添加"-"
2.计算小数点前部分,添加到字符串
3.循环计算小数点后部分,并利用hashmap记录每次的除数,如果在hashmap中存在过,说明存在循环小数部分
4.将循环部分括起来
第一次写出的答案如下:
提交后发现,有特殊情况没有考虑到。-2147483648 / -1 这种情况会溢出,所以需要使用long类型替换int。
参考修改后代码如下:
虽然在leetcode上提交成功了,但是在vs2015上运行是错误的,
这一句如果是numerator是-2147483648,a会是-2147483648,这非常诡异。不知道vs2015编译器对于这个问题是怎么解决的。
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.
Subscribe to see which companies asked this question
这个题的思路简单,
1.根据两个数得到结果正负,如负数,添加"-"
2.计算小数点前部分,添加到字符串
3.循环计算小数点后部分,并利用hashmap记录每次的除数,如果在hashmap中存在过,说明存在循环小数部分
4.将循环部分括起来
第一次写出的答案如下:
string fractionToDecimal(int numerator, int denominator) { string ret; int a = numerator; int b = denominator; ret = to_string(a / b); a = a % b; if (a) ret.push_back('.'); else return ret; unordered_map<int, int> m; int i = ret.length() - 1; while (a) { i++; if (m.find(a) != m.end()) { ret.insert(ret.begin() + m[a], '('); ret.push_back(')'); break; } m[a] = i; a *= 10; if (a < b) { ret.push_back('0'); continue; } ret.push_back('0' + a / b); a = a % b; } return ret; }
提交后发现,有特殊情况没有考虑到。-2147483648 / -1 这种情况会溢出,所以需要使用long类型替换int。
参考修改后代码如下:
string fractionToDecimal(int numerator, int denominator) { if (!numerator) return "0"; string ret; if (numerator < 0 ^ denominator < 0) ret += '-'; long a = numerator < 0 ? (long)numerator * (-1) : (long)numerator; long b = denominator < 0 ? (long)denominator * (-1) : (long)denominator; long c = a / b; ret += to_string(c); a = a % b; if (!a) return ret; ret.push_back('.'); unordered_map<long, long> m; int i = ret.length() - 1; while (a) { i++; if (m.find(a) != m.end()) { ret.insert(ret.begin() + m[a], '('); ret.push_back(')'); break; } m[a] = i; a *= 10; if (a < b) { ret.push_back('0'); continue; } ret.push_back('0' + a / b); a = a % b; } return ret; }
虽然在leetcode上提交成功了,但是在vs2015上运行是错误的,
long a = numerator < 0 ? (long)numerator * (-1) : (long)numerator;
这一句如果是numerator是-2147483648,a会是-2147483648,这非常诡异。不知道vs2015编译器对于这个问题是怎么解决的。
相关文章推荐
- ubuntu 安装 netbeans C++ IDE
- wep.py输出hello world
- iOS tabview 复用机制详解
- java.lang.IllegalThreadStateException: Thread already started
- java 实现简单的日历查询
- Mavne关于clean的问题
- bzoj3224 普通平衡树
- Storm 学习笔记(1-4)
- UI基础整理-14
- hdu 1242 Rescue
- get新技能!做excel表格超实用技巧大汇总
- Best way to determine if two path reference to sam
- 凸包——Graham-Scan算法
- 在网页中插入百度地图地址 及 解决百度地图中心偏移到左上角 的方法
- 使用FTP搭建YUM
- Android kernel
- 使用FTP搭建YUM
- Android图片压缩(质量压缩和尺寸压缩 File, Stream和Bitmap)
- 序列求和
- Hash(哈希)