【问题标题】:Counting to a million in Python - Theory在 Python 中数到一百万 - 理论
【发布时间】:2026-02-12 00:10:01
【问题描述】:

我正在学习 Python,遇到了一个类似“大声数到 1,000,000 需要多长时间?”的问题。它给出的唯一参数是“你平均每秒计算 1 个数字”。我做了那个问题,这不是很困难。然后我开始考虑大声数数,报出每个数字。这个参数对我来说似乎不对,事实上谷歌对“数到一百万要多长时间”这个问题的答案表明它已经关闭了。鉴于序列中的每个数字需要的时间越来越长(呈指数增长??),一定有更好的方法。

任何想法或一般指导都会有所帮助。以不同的时间间隔对不同人的“计数率”进行抽样是否有效?对音节数进行编程会起作用吗?我真的很好奇,并在 SO 和 Google 上寻找不围绕看似不准确的“平均时间”的解决方案。

谢谢,如果这不是主题或适当的地方,对不起。我是一个很长一段时间的潜伏者,但对发帖很陌生,所以如果您需要更多信息或任何东西,请告诉我。谢谢!

【问题讨论】:

  • 我认为你的直觉是一个很好的策略。沿着这条路提供帮助:integer to wordsyllables per word
  • 你应该尝试很多东西,这很清楚。但是如何衡量哪个更好,哪个更差?我认为您可以使用 IVONA 文本演讲引擎来验证您的每篇论文。 ivona.com(也许你可以在 python 中自动化这样的测试)
  • “鉴于序列中的每个数字需要的时间越来越长......”如果我理解你,我认为这个假设是错误的。 9999 -> 10000 是一个反例。
  • @Anonymous 感谢您的链接。我几乎完成了用 Python 构建的“音节计数应用程序”,IVONA 应该可以派上用场来检查我的工作!
  • 我认为发音 n 位数字的最坏情况时间比指数更接近 log(n) 之类的时间。考虑 777,777 和 77,777 中的音节数量(与发音时间呈线性相关)。

标签: math theory mathematical-optimization


【解决方案1】:

为了简单起见,我们假设您没有将 1502 称为“一千五百零二”,而是称为“一千五百零二”。然后我们可以分层分解。

不管你是否说“和”(though apparently it is more said than not),现在让我们忽略这个事实。我将使用这个参考(和英式英语,因为我更喜欢它并且更一致:http://forum.wordreference.com/showthread.php?t=15&langid=6)来了解如何发音数字。

事实上,为了正式地描述这一点,让t 成为一组数字的函数,它告诉您发音该组中的每个数字需要多少时间。那么你的问题是如何计算t([1..1000000]),我们将使用M=t([1..999])

前一个函数的三元组时间

要读取大数,我们从左侧开始读取三位数组。当然,左边的组可能只有一个或两个数字。

因此,对于每一个数字x,您会说x thousand y,其中y 将描述从1 到999 的所有数字。

因此,您在x thousand ... 中花费的时间是1000 t({1000x}) + M,详情如下:

请注意,通过简单地定义 t({0}) = 0,这个公式可以推广到 1000 以下的数字。

根据我们的假设,现在说“x 千”的时间等于说“x”的时间加上说“千”的时间(当 x > 0 时)。因此,您的答案是:

是说出千字所需的时间。这假设您将 1000 称为“一千”。如果您只想说“千”,您可能想删除 1000 tau("one")

我如何坚持参考:

数字 100-199 以一百……或一百……开头

您可以用完全相同的方式表示从 和上面的数字数到十亿所需的时间,以此类推,对于 103 的所有更大的幂,即

考虑到“和”

有一个小的修正要做。让我们假设M 是从 1 到 999 的数字发音所需的时间当它们前面至少有一组非 0 数字时,包括初始的“and”s。 p>

我们的参考资料(嗯,我链接的 wordreference 帖子)说:

加入群组需要注意什么? 通常,我们不使用任何连接词。 例外是最后一组。 如果千位之后的最后一组是 1-99,则它与 and 连接。

因此我们的更正仅适用于 0 到 999 之间的数字(前面没有非零组):

获取 M

或者更确切地说,让我们得到 t([1..999]),因为它更自然,而且我们知道它与 M 的关系。

C = t([1..99])X = t([1..9])

在 1 和 999 之间,我们有来自 [1..99] 的所有数字以及所有 9 个您不说“和”的确切数百个数字,即 108 次出现。有 900 个数字,以百个数字为前缀。

因此

C 可能很难分解,所以我不打算尝试。

最终结果

修正后的公式是:

作为 C 和 X 的函数:

请注意,如果您计划进行这种乘法并具有任何正确的数量级,您对 tau(word)、C 和 X 的度量需要非常精确。

结论:英国人最终会说很多“和”。最后一个公式的好处是,如果您决定实际上不想发音,则可以删除所有“和”。

【讨论】:

  • 刚刚登录给你一个当之无愧的+1