【问题标题】:Google: Divide and return result in form of string [duplicate]谷歌:除以字符串形式返回结果[重复]
【发布时间】:2014-06-26 09:20:54
【问题描述】:

我最近遇到了一个谷歌问的面试问题,我找不到解决这个问题的优化算法:

给定 2 个数字 a 和 b。 a和b相除,结果以字符串形式返回。

示例 1

Input: a=100 , b=3
Output: 33.(3)   
Note: (100/3)=33.33333....Here 3 is in brackets because it gets repeated continuously.

示例 2

Input: a=5 , b=10
Output: 0.5

示例 3

Input: a=51 , b=7
Output: 7.(285714)
Note: 51/7 = 7.285714285714285714285714285714......... Here 285714 is in brackets because it is repeating.

如果有人能想到这个问题的时间优化算法,那就太好了。 提前谢谢你。

【问题讨论】:

  • 你检查Stern–Brocot tree了吗?
  • 具体什么是规范,什么是自己的cmets,还不是很清楚。问题是什么?分工?小数位数?括号格式? 7.(285714) 来自哪里,是什么决定了小数位数?因为它们是一个序列,还是什么?
  • @n.m.特别是因为您只能从双精度浮点数中得到这么多小数...我想您需要一个特殊的浮点库才能获得“足够长”的结果字符串。
  • 谁说过花车?不是我。
  • @Lundin 我同意这个问题与 SO 几乎没有关系(尽管它可能与 Google 有关)。

标签: c string algorithm division


【解决方案1】:

您可以简单地手动执行长除法,即 O(N) 的位数 - 很难想象还有什么比这更好的方法。

长除法的唯一问题是,如果分数是重复小数,它永远不会终止,但您可以在开始之前轻松检测到这一点(如果b 具有除 2 和5)。如果它是一个重复的小数,你需要保留一个你已经看过的临时余数的列表。当你遇到一个你以前见过的,你就知道你刚刚找到了重复周期的结束。

【讨论】:

  • +1 it's hard to see how you could do better than that!!!
【解决方案2】:

您可能会尝试跟踪商中的最后 N 位数(N 等于除数中的位数)和余数,一旦您遇到相同的组合(最后 N 位数 + 余数)您的号码序列会重复(我没有确凿的证据,但面试问题不应该很难......)

【讨论】:

  • +1 为您服务,是的,跟踪最后 N 位数字似乎是可行的选择!
  • 但是浮点计算不是那么准确!使用 100 和 3,打印为%.20g 显示33.333333333333336,不等于33.(3)
  • 你不做浮点除法,你用模数做整数除法,记下结果和提醒。
猜你喜欢
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多