【问题标题】:Given a number X, find a number n such that the ceiling of n lg n = X给定一个数 X,找到一个数 n 使得 n lg n = X
【发布时间】:2015-01-19 16:05:08
【问题描述】:

我在试图找出公式来给我正确答案时迷失了。

假设 X = 10,我必须找到一个数字 n,使得天花板是天花板 [n lg n]

所以,对于 X = 10,经过反复试验,我得到 4.56 lg 4.56。

【问题讨论】:

  • “试验和错误” - 编写代码...
  • 如果您正在寻找一个公式,这个网站根本不是正确的地方
  • 您的示例甚至都不正确 - 您使用的是以 2 为底的对数,而不是自然对数。
  • 我有个更好的主意: 1. 在math.stackexchange.com 上提问。 2. 实现代码。 3. 如果您还有任何问题,请在此处再次提问,只是这次将您的代码包含在问题中
  • 这个问题在 [math] 标记下似乎很合适,但显示实际代码会更好,并且也可以避免混淆使用哪种基对数,正如 Mark Ransom 指出的那样。跨度>

标签: c algorithm math


【解决方案1】:

您可以通过Lambert W function 解决此问题。你想要的数字是 log(W(x)),假设你的对数是自然的。

【讨论】:

  • 这是一个有趣的想法。然而,对于 x=10,W(x) ~= 1.74553,log(W(z)) ~= 0.557。你能回顾一下你建议的公式吗?
  • @njuffa:我觉得应该是 e**W(X)
  • @GregS 你是对的:e**(W(10)) * ln(e^**(W(10))) 导致10
  • 糟糕,对不起,exp W(x) 是这样。
【解决方案2】:

@dmuir 在正确的轨道上,您可以使用 Lambert W function 来求解 n * log N = X。例如使用身份

W(n * log n) = log n

你可以推导出 n = eW(X)

对于 X=10,W(X) = 1.745528002,所以 n = e1.745528002 = 5.72892556

如果 lg n 是指以 2 为底的日志,则上述变为

n = eW(X * log(2)) = eW(X * 0.69314718055)

请注意,Lambert W 函数不能用基本函数表示。因此,像@Juan Lopes 这样的解决方案可能同样有效。

【讨论】:

    【解决方案3】:

    我不知道这个封闭公式,但你不能做一个简单的二分搜索,就像这个吗?

    double solve(double a, double b, double x) {
        if (abs(a-b) < 1e-6) return a;
        double n = (a+b)/2;
        if (n*log2(n) > x)
            return solve(a, n, x);
        else
            return solve(n, b, x);
    }    
    
    double solve(double x) {
        return solve(0, x, x);
    }
    

    【讨论】:

      猜你喜欢
      • 2019-09-17
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      • 1970-01-01
      • 2017-04-13
      相关资源
      最近更新 更多