【问题标题】:Perfect Power detection in linear time线性时间内完美的功率检测
【发布时间】:2011-09-04 00:33:01
【问题描述】:

我正在尝试编写一个 C 程序,给定一个正整数 n (> 1) 检测是否存在数字 x 和 r 以便 n = x^r

这是我到目前为止所做的:

while (c>=d) {
    double y = pow(sum, 1.0/d);
    if (floor(y) == y) {
        out = y;
        break;
    }

    d++;
}

在上面的程序中,“c”是指数 (r) 的最大值,“d”将从等于 2 开始。Y 是要检查的值,变量“out”设置为输出以后的那个值。基本上,脚本所做的是检查 y 的平方根是否存在:如果不存在,他会尝试使用平方根,依此类推......当他找到它时,他将 y 的值存储在“out”中,这样: y = out^d

我的问题是,有没有更有效的方法来找到这些值?我在网上找到了一些文档,但这比我的高中代数要复杂得多。如何以更有效的方式实现这一点?

谢谢!

【问题讨论】:

  • 我想你的意思是 n = x^r,对吧?
  • 使用浮点数对于找到完美的东西来说是个坏主意......
  • 我会担心得到一个“小”y:floor(16.9999999999999999987643254532423) != 17
  • 特别是这里使用floor肯定是错误的。
  • 有趣!谢谢!但是,那我该如何解决呢?我使用它是因为这是我想出的唯一解决方案......

标签: c performance algebra computation


【解决方案1】:

在您的一个 cmets 中,您声明您希望它与巨大的数字兼容。在这种情况下,您可能需要引入GMP library,它支持任意大数的运算,其中一个运算是checking if it is a perfect power

它是开源的,所以如果你不想引入整个库,你可以查看源代码,看看他们是如何做到的。

【讨论】:

  • 好吧,我已经听从了你的建议,他们通过一个巨大的复杂代码来实现,我现在将深入研究。谢谢!
【解决方案2】:

如果n 适合固定大小(例如 32 位)的整数变量,则最佳解决方案可能只是对此类数字列表进行硬编码并对其进行二进制搜索。请记住,在int 范围内,大致有

  • sqrt(INT_MAX)完美正方形
  • cbrt(INT_MAX)完美方块

在 32 位中,大约是 65536 + 2048 + 256 + 128 + 64 + ...

【讨论】:

  • 问题是我使用的是 unsigned long long int。我希望该程序也与巨大的数字兼容...
  • 在这种情况下,您需要一个几 GB 的表.. :-) 所以其他解决方案可能更可取。
【解决方案3】:

您需要 r-base logarithm,使用身份使用 natural log 计算它

所以:

log_r(x) = log(x)/log(r)

所以你需要计算:

x = log(n)/log(r)

(在我看来,这高中数学。这立即解释了我必须查找我是否正确记住了那个身份:))

【讨论】:

【解决方案4】:

在计算 y 之后

double y = pow(sum, 1.0/d);

你可以获得最接近它的 int 并且你可以使用你自己的幂函数来检查 与 sum 相等的条件。

int x = (int)(y+0.5);
int a = your_power_func(x,d);
if (a == sum)
     break;

我想这样你可以确认一个数字是否是其他数字的整数幂。

【讨论】:

    猜你喜欢
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2015-06-10
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    相关资源
    最近更新 更多