【leetcode热题】 分数到小数

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

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

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

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

示例 1:

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

示例 2:

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

示例 3:

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

解法一

这道题说简单的话,其实就是模拟下我们算除法的过程。

说难的话,有很多坑的地方要注意下,自己也是提交了好几次,才 AC 的,需要考虑很多东西。

首先说一下我们要模拟一下什么过程,以 20/11 为例。

第一次得到的商,就是我们的整数部分,int 间运算就可以直接取到整数部分了,记为 integer

也就是 integer = 20 / 11 = 1

然后回想一下我们用竖式计算的过程。

如下图,首先得到了商是 1,余数是 9。在程序中得到余数的话,可以用 被除数 - 商 * 除数

也就是 20 - 1 * 11 = 9

如下图,接下来我们将余数乘以 10 做为新的被除数,继续把 11 当做除数。然后得到商和新的余数。

也就是计算 90 / 11

如下图,接下来重复上边的过程,用余数乘以 10 做为新的被除数,继续把 11 当做除数。然后得到商和新的余数。

也就是计算 20 / 11

如下图,接下来继续重复上边的过程,用余数乘以 10 做为新的被除数,继续把 11 当做除数。然后得到商和新的余数。

也就是计算 90 / 11

那么什么时候结束呢?

  • 第一种情况,余数为 0,说明没有循环小数。

  • 第二种情况,一开始这里爬坑了。开始觉得只要商里边出现重复的数字(不考虑整数部分的数字,也就是上边例子的第一个 1),就可以认为出现了循环小数。

    比如上边的例子,8 第二次出现,所以到这里不再计算。而循环小数部分就是和当前数字重复的位置到当前位置的前一个,也就是 81。所以最终结果就是 1.(81)

    但提交的时候,出现了一个反例,如下图。

    虽然出现了重复的 8,但最终结果并不是 8 循环。很明显下次是 40 / 17,需要商 2。至于原因就是两次商 8 所对应的被除数并不一样,第一次是 150 ,第二次是 140

    所以为了判断是否出现循环小数,我们不应该判断是否出现了重复的商,而是应该判断是否出现了重复的被除数。

经过上边的分析,循环也很明显了。被除数除以除数,记录商。然后余数乘以 10 做为新的被除数继续除以除数。直到余数为 0 或者出现重复的被除数。

记录商的话,我们将整数部分和小数部分单独记录。因为小数部分要累积记录,一开始我用的是一个 int 去保存小数部分。比如第一个商是 1,第二个商是 2,我把之前的商乘以 10 再加上新的商。也就是 1 * 10 + 2 = 12,当第三个商 5 来的时候,就是 12 * 10 + 5 = 125,看起来很完美。

但比如上边的例子 1/17 ,小数部分第一个商是 0,第二个商是 5,如果按上边的记录方法,记录的就是 5,而不是 05。另外,如果商的部分数字过多的话,还会产生溢出,所以最终用 String 记录了商,每次将新的商加到 String 中即可。

还有一个问题就是怎么判断是否出现了重复的商?

很简单,用一个 HashMapkey 记录出现过的被除数,value 记录商出现的位置,这样当出现重复被除数的时候,通过 value 立刻知道循环的小数部分是多少。

最后一个问题,我们只考虑了正数除以正数的例子,对于正数除以负数或者负数除以负数呢?和我们在纸上算一样,先确定商的符号,然后将被除数和除数都转为正数即可。

上边的操作会带来一个问题,对于 java 而言,int 类型的话,负数的最小值是 -2147483648,正数的最大值是 2147483647,并不能把-2147483648 转成正数,至于原因的话可以参考这篇文章,补码。

溢出这个问题其实不是这个题的关键,所以我们直接用数据范围更大的 long 去存数字就可以了。

public String fractionToDecimal(int numerator, int denominator) {long num = numerator;long den = denominator;String sign = "";//确定符号if (num > 0 && den < 0 || num < 0 && den > 0) {sign = "-";}//转为正数num = Math.abs(num);den = Math.abs(den);//记录整数部分long integer = num / den;//计算余数num = num - integer * den;HashMap<Long, Integer> map = new HashMap<>();int index = 0;String decimal = "";//记录小数部分int repeatIndex = -1;//保存重复的位置while (num != 0) {num *= 10;//余数乘以 10 作为新的被除数if (map.containsKey(num)) {repeatIndex = map.get(num);break;}//保存被除数map.put(num, index);//保存当前的商long decimalPlace = num / den;//加到所有的商中decimal = decimal + decimalPlace;//计算新的余数num = num - decimalPlace * den;index++;}//是否存在循环小数if (repeatIndex != -1) {String dec = decimal;return sign + integer + "." + dec.substring(0, repeatIndex) + "(" + dec.substring(repeatIndex) + ")";} else {if (decimal == "") {return sign + integer;} else {return sign + integer + "." + decimal;}}
}

有人可能会问,如果数字很大,又超过了 long 怎么办,一种方案是之前写过的 29 题,因为负数存的数更多,所以我们可以把负数当做正数,正数当做负数,所有的计算都在负数范围内计算。另一种方案的话, java 其实已经提供了大数类 BigInteger 供我们使用,就不存在溢出的问题了。至于原理的话,应该和第 2 题 大数相加一样,把数字用链表去存储,这样多大的数字都能进行存储了,然后把运算法则都封装成方法即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/750241.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt教程 — 3.4 深入了解Qt 控件:Input Widgets部件(3)

目录 1 Input Widgets简介 2 如何使用Input Widgets部件 2.1 Dial 组件-模拟车速表 2.2 QScrollBar组件-创建水平和垂直滚动条 2.3 QSlider组件-创建水平和垂直滑动条 2.4 QKeySequenceEdit组件-捕获键盘快捷键 Input Widgets部件部件较多&#xff0c;将分为三篇文章介绍…

DDR协议基础进阶(三)——(基本功能、初始化、MR寄存器)

DDR协议基础进阶&#xff08;三&#xff09;——&#xff08;基本功能、初始化、MR寄存器&#xff09; 一、DDR基本功能 DDR基本功能主要包括&#xff1a; 8-bit prefetch预取——8-bit&#xff0c;是指8位数据&#xff0c;即8倍芯片位宽的数据。由于DDR内部数据传输是32bit…

sadtalker-api/

运行&#xff0c;点击网址&#xff0c;加载不出 需要保存代码后&#xff0c;点击网址 [Bug]: ModuleNotFoundError: No module named torchvision.transforms.functional_tensor torchvision 0.17 promblem Open ./venv/lib/python3.10/site-packages/basicsr/data/degradati…

python3GUI--qt仿暴风影音视频播放器By:PyQt5(附下载地址)

文章目录 一&#xff0e;前言二&#xff0e;环境1.开发环境2.打包环境3.运行环境 三&#xff0e;软件截图1.启动页2.视频播放3.音频播放4.其他1.托盘2.对话框 四&#xff0e;功能总览五&#xff0e;代码展示&心得1.UI设计2.如何防止卡顿3.如何自定义组件 五&#xff0e;思考…

CSS3DRenderer, CSS3DSprite API 使用案例demo

CSS3DRenderer, CSS3DSprite API 使用案例demo <!DOCTYPE html> <html><head><title>three.js css3d - sprites</title><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, user-scalabl…

VLC抓取m3u8视频

前言 最近想看一些网络视频&#xff0c;但是很多时候网页上是m3u8推流的&#xff0c;如果在线看&#xff0c;速度又慢&#xff0c;所以就想下载下来&#xff0c;就想到了VLC的推流&#xff0c;转换能力&#xff0c;查阅资料&#xff0c;加上实践&#xff0c;总结心得。 设置中…

RabbitMQ进阶

1.消息可靠性 消息从发送,到消费者接收,会经历多个过程: 其中的每一步都可能导致消息丢失,常见的丢失原因包括: - 发送时丢失: - 生产者发送的消息未送达exchange - 消息到达exchange后未到达queue - MQ宕机,queue将消息丢失 - consumer接收到消息后未消费就宕机 …

【C语言】浮点型在内存中的存储

文章目录 例题引入剖析原因浮点型的二进制转换&#xff08;M&#xff09;正负号之分&#xff08;S&#xff09;科学记数法&#xff08;E&#xff09;关于 S E M 在内存中的存储存取浮点型时的情况讨论 例题解析整形存储为浮点型并输出浮点型存储为整形并输出 在我的上一篇博客中…

接雨水-热题 100?-Lua 中文代码解题第4题

接雨水-热题 100&#xff1f;-Lua 中文代码解题第4题 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释…

算法——前缀和之除自身以外数组的乘积、和为K的子数组、和可被K整除的子数组、连续数组、矩阵区域和

这几道题对于我们前面讲过的一维、二维前缀和进行了运用,包含了面对特殊情况的反操作 目录 4.除自身以外数组的乘积 4.1解析 4.2题解 5.和为K的子数组 5.1解析 5.2题解 6.和可被K整除的子数组 6.1解析 6.2题解 7.连续数组 7.1题解 7.2题解 8.矩阵区域和 8.1解析 …

GET和POST方法的区别

GET和POST的区别 在我们开发项目的时候常常会在Controller层使用到POST方法或者GET方法&#xff0c;犹豫到底将接口定义为GET方法还是POST方法&#xff1f;那这两者之间有什么区别呢&#xff1f; 看一下官方定义&#xff1a; GET 和 POST 是 HTTP 协议中最常用的两种请求方法…

爬虫学习 Scrapy中间件代理UA随机selenium使用

目录 中间件UA、代理处理---process_requestUA随机 代理处理seleniumscrapy 中间件 控制台操作 (百度只起个名 scrapy startproject mid scrapy genspider baidu baidu.com setting.py内 ROBOTSTXT_OBEY FalseLOG_LEVEL "WARNING"运行 scrapy crawl baidu middle…

ArcGIS分享图层数据的最佳方法

在工作中&#xff0c;经常需要将图层数据分享给其他人。 如下图所示&#xff0c;需要分享的是【CJDCQ】和【GHDLTB】&#xff0c;图层带有符号系统&#xff1a; 一、分享gdb数据库及lyr文件 分享数据自然要找到源数据&#xff1a; 但是&#xff0c;gdb数据是不带符号系统的&a…

微信小程序开发系列(三十四)·自定义组件的创建、注册以及使用(数据和方法事件的使用)

目录 1. 分类和简介 2. 公共组件 2.1 创建 2.2 注册 2.3 使用 3. 页面组件 3.1 创建 3.2 注册 3.3 使用 4. 组件的数据和方法的使用 4.1 组件数据的修改 4.2 方法事件的使用 1. 分类和简介 小程序目前已经支持组件化开发&#xff0c;可以将页面中的功能…

springboot基于spring boot的在线答题微信小程序

摘 要 在线答题微信小程序是考试中重要的一环&#xff0c;在线答题是学生获取任务信息的主要渠道。为了方便学生能够在网站上查看任务信息、考试&#xff0c;于是开发了基于 springboot框架设计与实现了一款简洁、轻便的在线答题微信小程序。本微信小程序解决了在线答题事务中的…

2.3 HTML5新增的常用标签

2.3.1 HTML5新增文档结构标签 在HTML5版本之前通常直接使用<div>标签进行网页整体布局&#xff0c;常见布局包括页眉、页脚、导航菜单和正文部分。为了区分文档结构中不同的<div>内容&#xff0c;一般会为其配上不同的id名称。例如&#xff1a; <div id"h…

每天学习一个Linux命令之rsync

每天学习一个Linux命令之rsync 介绍 在Linux系统中&#xff0c;有许多强大的工具可用于文件和目录之间的同步和备份。其中一个最常用且功能强大的工具是rsync。rsync是一款开源的命令行工具&#xff0c;用于快速、安全和有效地将文件和目录从一个位置同步到另一个位置。 rsy…

FFmpeg转码参数说明及视频转码示例

-b : 设置音频或者视频的转码码率 -b:v 只设置视频码率 -b:a 只设置音频码率 -ab: 只设置音频码率, 默认码率大小为: 128k bit/s -g: 设置视频GOP大小,表示I帧之间的间隔,默认为12 -ar: 设置音频采样率,默认0 -ac: 设置音频通道数量 默认0 -bf: 设置连…

CTFHUB-web-信息泄漏

题目所在位置&#xff1a;技能树->web->信息泄漏 目录遍历 打开题目&#xff0c;我们进入的是这个页面 翻译过来就是 得到的信息就是&#xff1a;flag要在这些目录里面寻找&#xff0c;我们直接一个一个点开查看就行 发现得到一个flag.txt&#xff0c;点击打开得到flag …

开发K8S Operator

原理 大多数人使用Kubernetes的方式是使用原生资源(如pod、deployment、service等)部署应用程序。但是,也可以扩展Kubernetes的功能,从而添加满足特定需求的新业务逻辑,这就是Operator的作用。 作用 Operator应用,当我们在运用集群能力部署应用时,可能需要一组资源同时部…