打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
不使用+或-运算符,计算两数之和
问题描述
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数。
如果小数部分为循环小数,则将循环的部分括在括号内;如果存在多个答案,只需返回任意一个 。
对于所有给定的输入,保证答案字符串的长度小于 10^4 。
示例一:
输入:dividend = 1, divisor = 2
输出:"0.5"
示例二:
输入:dividend = 4, divisor = 333
输出:"0.(012)"
示例三:
输入:dividend = 2, divisor = 1
输出:"2"
算法描述
由题意知两数相除存在三种结果(整除、有限小数和无限循环小数)
1.整除:被除数和整数相除后直接返回结果
2.有限小数:很简单直接相除判断余数是否为零,若为零直接结束程序返回结果,不为零则重复操作
3.无限循环小数:怎么判断无限循环小数,先观察无限循环小数的特点(如3.77777777……)即在某一位后的结果都是一样的,又因为除法得到下一位的计算方式是余数*10/除数,除数不变的条件下,下一位的结果又和前一位相同,所以只要该位的余数和前一位相同,则可以判定为无限循环小数。
4.怎样输出无线循环小数的结果:用哈希表存储每一次的余数,当出现相同余数的时候,就可以截取该第一次出现位置到当前结尾的字符串,再将该片段放入括号中和整数、小数点部分一起输出即可。
代码清单
将分数转化为小数
def fctbcdm(dividend, divisor):  # 被除数,除数
# 先判断除式整体的符号
if (dividend > 0 and divisor < 0) or (dividend < 0 and divisor > 0):
symbol = -1
else:
symbol = 1
# 全部转换为正数,防止取模时存在影响
dividend = abs(dividend)
divisor = abs(divisor)
# 对除式进行求余,取整操作
quotient = dividend // divisor
remainder = dividend % divisor
# 刚好可以被整除,直接输出
if remainder == 0:
return str(quotient * symbol)
# 答案的整数部分
ans = [str(quotient), '.']
# 建立哈希表,记录余数值和其位置
repeats = dict()
i = 0
# 由题知输出小数的长度小于10^4,所以i<10^4
while i < 10000:
# 将上一次的余数转换为新的被除数
dividend1 = remainder * 10
quotient = dividend1 // divisor
remainder = dividend1 % divisor
# 判断该余数是否出现过,出现过就可以返回值了
# 该余数已经在repeats中出现过了
if dividend1 in repeats:
# 用insert将“(”添加到指定元素的前面,将“)”添加到最后
ans.insert(repeats[dividend1], '(')
ans.append(')')
break
# ans列表中增加一位数
ans.append(str(quotient))
# +2是因为ans列表里面前两个元素是整数位和小数点
repeats[dividend1] = i + 2
if remainder == 0:
break
i += 1
# 除式整体为负数时
if symbol == -1:
return ''.join(ans)
return ''.join(ans)
print(fctbcdm(-50, 8))
实习编辑:李欣容
稿件来源:深度学习与文旅应用实验室(DLETA)
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Linux内核中64位除法函数do_div
这个小学的问题,别说你不会
divisor详细设计方案
Java开发笔记(八)五种算术运算符
excel数学运算函数:表格中积商和余数的处理方法
【精品博文】你真的搞明白CRC的计算过程了吗?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服