C++刷LeetCode(166. 分数到小数)【数学】【数据类型】
题目描述:给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。
如果小数部分为循环小数,则将循环的部分括在括号内。
示例 1:
输入: numerator = 1, denominator = 2
输出: "0.5"
示例 2:
输入: numerator = 2, denominator = 1
输出: "2"
示例 3:
输入: numerator = 2, denominator = 3
输出: "0.(6)"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fraction-to-recurring-decimal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
//这里定义在一个小数里,小数部分有相同的数字重复出现的就是循环小数??为啥?整数相除不会出现无限无限不循环吗??????
if(denominator == 0)return "";
if(numerator == 0)return "0";
string result;
//转换成long long类型防止溢出
long long num = (long long)numerator;
long long denom = (long long)denominator;
//处理正负号,一正一负取负号
if((num > 0) ^ (denom > 0))result.push_back('-');
//将分子分母全部转换为正数
num = abs(num);
denom = abs(denom);
//处理整数部分
result.append(to_string(num / denom));
//处理小数部分
num %= denom;
if(num == 0)return result;
result.push_back('.');
int index = result.size() - 1;//小数点的下标
unordered_map<int, int>record;
while(num && record.count(num) == 0){
record = ++ index;
num *= 10;
result += to_string(num / denom);
num %= denom;
}
if(record.count(num) == 1){
result.insert(record, "(");
result.push_back(')');
}
return result;
}
};
代码参考:https://leetcode-cn.com/problems/fraction-to-recurring-decimal/solution/cmo-ni-ti-jian-dan-yi-dong-by-xiaoneng/
这里定义在一个小数里,小数部分有相同的数字重复出现的就是循环小数??为啥?整数相除不会出现无限无限不循环吗??????整数比一定是有理数 永恒的蓝色梦想 发表于 2020-8-18 17:00
整数比一定是有理数
那会出现这种3.121类似这种情况,1出现两次但是3.121不是循环小数的情况吗? 本帖最后由 livcui 于 2020-8-18 22:04 编辑
糖逗 发表于 2020-8-18 19:36
那会出现这种3.121类似这种情况,1出现两次但是3.121不是循环小数的情况吗?
最后一步我觉得是在找重复的余数...
if(record.count(num) == 1){
result.insert(record, "(");
result.push_back(')');
糖逗 发表于 2020-8-18 19:36
那会出现这种3.121类似这种情况,1出现两次但是3.121不是循环小数的情况吗?
会,所以有些 Project Euler 的题目我还在考虑…… livcui 发表于 2020-8-18 21:02
最后一步我觉得是在找重复的余数...
对,所以这道题我很疑惑。 糖逗 发表于 2020-8-19 00:00
对,所以这道题我很疑惑。
我觉得他是用重复余数判断循环的吧 livcui 发表于 2020-8-19 09:02
我觉得他是用重复余数判断循环的吧
但重复余数一定是循环数吗 糖逗 发表于 2020-8-19 10:27
但重复余数一定是循环数吗
在小数部分我觉得是的
页:
[1]