当前位置: 首页 > article >正文

字符串形式返回小数

给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。

如果小数部分为循环小数,则将循环的部分括在括号内。

如果存在多个答案,只需返回 任意一个 。

对于所有给定的输入,保证 答案字符串的长度小于 104 。

示例 1:

输入:numerator = 1, denominator = 2
输出:"0.5"

示例 2:

输入:numerator = 2, denominator = 1
输出:"2"

示例 3:

输入:numerator = 4, denominator = 333
输出:"0.(012)"

提示:

  • -231 <= numerator, denominator <= 231 - 1
  • denominator != 0
class Solution {
public:
    string fractionToDecimal(int numerator, int denominator) {
        if (numerator == 0) return "0"; // 特殊情况:分子为0
        string result;
        
        if ((numerator < 0) ^ (denominator < 0)) result += "-"; // 处理符号,判断分子和分母是否符号相反
        
        // 转换为长整型,处理溢出
        long num = labs(numerator);
        long den = labs(denominator);

        result += to_string(num / den); // 先添加整数部分

        long remainder = num % den; //通过取余操作 num % den 计算余数
        if (remainder == 0) return result; // 如果没有小数部分,直接返回结果
        
        result += "."; // 添加小数点
        unordered_map<long, int> map; // 用于记录余数及其对应的小数位索引
        map[remainder] = result.size(); // 记录余数的位置
        
        while (remainder != 0) {
            remainder *= 10; // 处理下一位
            result += to_string(remainder / den); // 获取当前位
            remainder %= den; // 更新余数
            
            if (map.find(remainder) != map.end()) { // 检测循环
                // 找到循环
                result.insert(map[remainder], "("); // 在循环开始的位置插入 "("
                result += ")"; // 添加 ")"
                break;
            }
            map[remainder] = result.size(); // 记录当前余数的位置
        }
        
        return result;
    }
};

 

unordered_map<long, int> map;是一个哈希表数据结构,它通过键值对的形式存储数据,键为 long 类型,值为 int 类型。

map[remainder] = result.size(); 将当前的余数 remainder 和当前的结果字符串 result 的长度存储到 map 中。

if (map.find(remainder) != map.end()).find() 将返回一个 迭代器,指向该余数在 map 中的位置。返回 map.end() 时,意味着 remaindermap 中不存在,即该余数还没有出现过。

假设我们在计算 4 / 333,余数为 4

  1. 第一步

    • remainder = 4
    • remainder *= 10remainder = 40
    • 40 / 333 = 0,所以 result 添加 "0",结果变为 "0.0"
    • remainder %= 333remainder = 40
  2. 第二步

    • remainder = 40
    • remainder *= 10remainder = 400
    • 400 / 333 = 1,所以 result 添加 "1",结果变为 "0.01"
    • remainder %= 333remainder = 67
  3. 第三步

    • remainder = 67
    • remainder *= 10remainder = 670
    • 670 / 333 = 2,所以 result 添加 "2",结果变为 "0.012"
    • remainder %= 333remainder = 4
  4. 第四步

    • 余数再次变为 4,说明出现循环,此时可以插入括号表示循环部分,结果变为 "0.(012)"

http://www.kler.cn/a/329118.html

相关文章:

  • python学习_2.去除字符strip方法
  • 博客园-awescnb插件-geek皮肤优化-样式优化
  • 20241116解决在WIN11和ubuntu20.04通过samba共享时出现局域网千兆带宽拉满的情况
  • 掌握Golang中的数据竞争检测:runtime/race包全面教程
  • 【分布式技术】ES扩展知识-Elasticsearch分词器的知识与选择
  • Android Activity Manager Service (AMS) 深入详解及源码分析
  • 新高考的五大变化‌‌(AI生成)
  • PHP反序列化6(session反序列化)
  • 确保架构与业务一致性和合规性的成功转型之路:理论与实践的全面解读
  • VR视频怎样进行加密和一机一码的使用?--加密(一)
  • Spring Boot 进阶- Spring Boot日志框架介绍
  • Python面向对象基础:属性动态添加
  • Java 编码系列:并发集合详解与面试题解析
  • C语言_字符函数和字符串函数
  • 网络原理-TCP协议
  • 使用 Docker 制作 YashanDB 镜像:深度解析与实战指南
  • 优秀博客:小程序通信方法在 Vue 3 中的对应技术
  • 分页查询前后端代码
  • 怎么在FTP服务器上配置SSL/TLS?
  • Python知识点:如何使用Spark与PySpark进行分布式数据处理
  • Linux——K8s pod调度
  • 用 API 实现 AI 视频摘要:动手制作属于你的 AI 视频小助手
  • docker的harbor仓库登录问题
  • Linux设备上cifx板卡作为ethercat从站的调试记录
  • 【Android 13源码分析】Activity生命周期之onCreate,onStart,onResume-1
  • 计算机网络:计算机网络概述 —— 初识计算机网络