糖逗 发表于 2020-8-18 15:15:47

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:16

这里定义在一个小数里,小数部分有相同的数字重复出现的就是循环小数??为啥?整数相除不会出现无限无限不循环吗??????整数比一定是有理数

糖逗 发表于 2020-8-18 19:36:16

永恒的蓝色梦想 发表于 2020-8-18 17:00
整数比一定是有理数

那会出现这种3.121类似这种情况,1出现两次但是3.121不是循环小数的情况吗?

livcui 发表于 2020-8-18 21:02:40

本帖最后由 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 22:42:45

糖逗 发表于 2020-8-18 19:36
那会出现这种3.121类似这种情况,1出现两次但是3.121不是循环小数的情况吗?

会,所以有些 Project Euler 的题目我还在考虑……

糖逗 发表于 2020-8-19 00:00:48

livcui 发表于 2020-8-18 21:02
最后一步我觉得是在找重复的余数...

对,所以这道题我很疑惑。

livcui 发表于 2020-8-19 09:02:30

糖逗 发表于 2020-8-19 00:00
对,所以这道题我很疑惑。

我觉得他是用重复余数判断循环的吧

糖逗 发表于 2020-8-19 10:27:08

livcui 发表于 2020-8-19 09:02
我觉得他是用重复余数判断循环的吧

但重复余数一定是循环数吗

livcui 发表于 2020-8-19 10:55:08

糖逗 发表于 2020-8-19 10:27
但重复余数一定是循环数吗

在小数部分我觉得是的
页: [1]
查看完整版本: C++刷LeetCode(166. 分数到小数)【数学】【数据类型】