【问题标题】:How to check if number is summation of powers of 5 [closed]如何检查数字是否是5的幂的总和[关闭]
【发布时间】:2014-11-11 10:28:36
【问题描述】:

如何判断一个数是否是 5 的幂?

我可以想到下面的算法。有没有办法改进它?有什么数学技巧吗?

  1. 首先检查最后一位是否为 5。
  2. 如果最后一位是 5;除以 5。
    如果除法的结果是 1,则数字是 5 的幂。
    否则检查除法结果本身是否为 5 的幂(即,以结果为数字转到第 1 步)。

【问题讨论】:

  • @mat 你有什么建议?删除步骤和做什么?题外话是什么意思。如果您知道任何特定文档,请指出它。这将比这样的 cmets 有所帮助。
  • > 有什么数学技巧吗?您的算法似乎是有效的,除非您想用汇编语言编写代码并需要优化。输入可以有多大?数千位数字,以文本文件的形式发送?
  • @TimothyHa 数字可以很大也可以很小。与我几乎原始的方法相比,我更倾向于知道更好的解决方案。
  • 如果数字包含数千位数字,则您的算法将不起作用,而不像 Pham Trung 的回答那样适合 INT 或 LONG。而且取对数也可能是个问题。

标签: algorithm math numbers


【解决方案1】:

您不需要查看单个数字,您可以这样做:

n = (int)(log(x) / log(5)); // get n = log5(x), truncated to integer
if (pow(5, n) == x)         // test to see whether x == 5^n
    // x is a power of 5

LIVE DEMO

【讨论】:

  • 听起来不错。但是,从编程/算法的角度来看,“日志”方法可能不适用于每种语言。
  • 是的 - 我不知道任何没有基本数学函数的现代语言,如 logpow 等,但你永远不知道。当然,如果语言不支持,您始终可以实现自己的版本。
【解决方案2】:

只有很少的五次方适合 int/long 范围,因此您只需生成所有它们并一一检查(少于 60 个数字),使用 HashSet 将具有 O(1) 时间复杂度

【讨论】:

  • 我的 CS 教授曾经给我提供大文件中的数字,而不是 int 或 long。
  • @TimothyHa 所以在 HashSet 中你可以保留字符串、BigNums 或任何表示(如哈希、模块算术......)。但是,您可以在 O(lg n) 中轻松检查它,而无需存储结果。看my answer。 Pham Trung:+1,用于撰写 O(1) 解决方案(预处理后)。
【解决方案3】:

逐次除法,直到你达到不被5整除的数字,并检查结果是否等于1,这不是坏的解决方案。它需要 log_5(n) 个操作,所以它是 O(lg n),这是非常好的时间。对于9094947017729282379150390625,只有 40 次操作!

【讨论】:

  • 这个运行时中的 n 是什么?
  • 这是要检查的号码。 (假设除以 5 具有 O(1) 复杂度。对于具有数百万位数的数字显然是错误的,但是任何算法都有这个问题,所以我跳过了。)包括数字的大小它将接近 O(lg^2 n).
【解决方案4】:

我要做的是首先创建一个数字数组,它们是 5 的幂。您可以使用一个范围,然后说,对于范围中的每个值,将该值取五次方,然后推送新值进入数组。

然后你会发现如果 n,你正在寻找的数字包含在数组中。

【讨论】:

    猜你喜欢
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多