解题思路:

这道题目的核心是怎么找到循环部分:当出现重复的余数时,就会出现循环。

前面需要考虑比较多种情况:除数是否为0;结果的正负;结果的整数部分和小数部分分开求解。

在求解小数部分的时候,需要用到 unordered_map 来记录出现过的余数。同时需要用一个数组来记录每一次除法得到的商的字符串。

具体程序如下:

class Solution {
public:string fractionToDecimal(int numerator, int denominator) {//如果除数是0,就直接返回0if(numerator == 0) return "0";//用flag来判断正负int flag = 1;if(numerator < 0 && denominator > 0 || numerator > 0 && denominator < 0) flag = -1;string res;if(flag == -1) res += '-';//需要注意int型的整数范围,最小的负数去反之后,会超出int的表示范围,所以要改成long型long numer = numerator;long denomin = denominator;if(numer < 0) numer = -1 * numer;if(denomin < 0) denomin = -1 * denomin;//这一部分先处理结果的整数部分,分为两种情况:整数部分为0,整数部分大于0if(numer < denomin) res += "0.";else{res += to_string(numer / denomin);numer = numer % denomin;if(numer > 0) res += '.';}//下面处理小数部分//用unordered_map来记录出现的余数,当出现重复的余数时,就是出现了循环unordered_map<long, string> mp;  //存储<余数, 商>vector<string> num;  //num中记录每一次除法得到的商string xunhuanshang;while(numer > 0){unordered_map<long, string>::iterator it;it = mp.find(numer);string tmp;long shang;if(it == mp.end()){long count = 0;   //用于记录需补0的个数long numer_tmp = numer;while(numer_tmp < denomin){numer_tmp *= 10;count++;}while(count > 1){tmp += '0';count--;}shang = numer_tmp / denomin;long yushu = numer_tmp % denomin;mp[numer] = tmp + to_string(shang);string tmpp = tmp + to_string(shang);num.push_back(tmpp);numer = yushu;}else {xunhuanshang = mp[numer];break;}}for(int i = 0; i < num.size(); i++){if(num[i] == xunhuanshang){  //找到循环开始的商res += '(';for(int j = i; j < num.size(); j++)res += num[j];res += ')';break;}else{res += num[i];}}return res;}
};

Leetcode 166. 分数到小数 解题思路及C++实现相关推荐

  1. int 小数_[LeetCode] 166. 分数到小数

    题目描述 : https://leetcode-cn.com/problems/fraction-to-recurring-decimal/ 题目描述: 给定两个整数,分别表示分数的分子 numera ...

  2. LeetCode 166. 分数到小数(小数除法)

    1. 题目 给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数. 如果小数部分为循环小数,则将循环的部分括在括号内. 示例 1: 输入: num ...

  3. leetcode 166分数到小数

    手动排除特殊情况: 对于一般情况,使用位运算和加减法来计算除法,使用sign记录结果符号:(这部分为leetcode 29题的答案) 使用hashmap来记录循环体出现的开始位置(如果有的话),使用f ...

  4. LeetCode 166. 分数到小数

    思路: 循环体出现的依据是,产生重复的余数,即每次mod*10 后再和 除数b计算出新余数,和之前的比较即可. 先对int型数据进行转换为long 以免int负数最小值化正越界 判定正负数, 结果是否 ...

  5. 166. 分数到小数

    166. 分数到小数 给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 . 如果小数部分为循环小数,则将循环的部分括在括号内. 如果存在多个 ...

  6. Leetcode 313. 超级丑数 解题思路及C++实现

    解题思路: 与Leetcode 264. 丑数 II的解题思路一样,均使用最小堆来存储丑数,第i次更新最小堆时,得到第i大的丑数. 可结合Leetcode 264. 丑数 II的解题思路理解:http ...

  7. Leetcode 234. 回文链表 解题思路及C++实现

    解题思路: 先用快慢指针找到链表的中间节点,然后将链表一分为二: 然后将后半部分链表进行翻转,用到三个指针: 接着分别遍历两个链表,逐个比较 val 值,如果出现不相等,就返回 false. /*** ...

  8. Leetcode 152. 乘积最大子序列 解题思路及C++实现

    解题思路: 求乘积最大的子序列,不同于和最大的子序列,两个负数相乘是会得到正数的,所以在遍历数组nums时,需要存储最大和最小的子序列乘积.然后每遍历一个元素,更新一次. class Solution ...

  9. Leetcode 217. 存在重复元素 解题思路及C++实现

    方法一:暴力法 解题思路: 利用 unordered_map 来对出现的数字进行计数,一旦出现有重复数字,就返回true,否则就返回false. class Solution { public:boo ...

最新文章

  1. 论坛服务软件Discux_X3.4的部署
  2. RabbitMq 安装
  3. 交互系统的构建之(二)Linux下鼠标和键盘的模拟控制
  4. 如何系统自学python_如何系统地自学 Python?
  5. 系统科学专业 计算机,2018年北京市培养单位数学与系统科学研究院863计算机学科综合(专业)之计算机操作系统考研核心题库...
  6. 我整理的一份来自于线上的Nginx配置(Nginx.conf),希望对学习Nginx的有帮助
  7. mysql federated engine
  8. matlab plot颜色
  9. VueCli 中安装 axios
  10. 网络空间安全导论期末复习资料
  11. 爬虫工程师是干什么的
  12. 1 0.99999的悖论_天文学科普:带你了解反物质、费米悖论和黑洞
  13. 简单的天气变幻系统,简单易用的unity天气插件UniStorm教程
  14. 将HTML5封装成android应用APK文件的几种方法
  15. Vue中定制公共组件之modal
  16. [RCTF2019]printer详解(python脚本、USB协议精解、TSLP2文档阅读)
  17. 我喜欢的爱豆竟然在赛博朋克空间跳舞,怎么实现的?
  18. JAVA计算机毕业设计上虞烟草物流配送系统(附源码、数据库)
  19. PhysX物理引擎入门
  20. python-对象类型

热门文章

  1. 麒麟810怎么样_华为麒麟810这个跑分,让我意外
  2. cmd与monkey测试
  3. 解决AttributeError: 'module' object has no attribute 'main' 安装第三方包报错
  4. [网络] SOCKET, TCP/UDP, HTTP, FTP
  5. (转) Docker EE/Docker CE简介与版本规划
  6. Servlet3.0 multipart 文件上传技术
  7. Spring-Security (学习记录四)--配置权限过滤器,采用数据库方式获取权限
  8. sqlserver 2008r2 表分区拆分问题
  9. 一位来自《seo实战密码》读者的来信
  10. datagridview当传递具有已修改行的 DataRow 集合时,更新要求有效的 UpdateCommand。