使用最少的呼叫数打印多项式

Dan*_*iel 13 algorithm polynomial-math

我一直在接受这些艰难的面试问题.这个真让我感到困惑.

您将获得一个poly获取并返回的函数int.它实际上是一个非负整数系数的多项式,但你不知道系数是什么.

您必须编写一个函数,使用尽可能少的调用来确定系数poly.

我的想法是使用递归知道我可以得到最后一个系数poly(0).所以我想,以取代poly(poly - poly(0))/x,但我不知道如何做到这一点的代码,因为我只能打电话poly.任何人都知道如何做到这一点?

Pen*_*One 28

这是一个巧妙的技巧.

int N = poly(1)

现在我们知道多项式中的每个系数最多N.

int B = poly(N+1)

现在扩展B基数N+1,你有系数.


试图解释:代数上,多项式是

poly = p_0 + p_1 * x + p_2 * x^2 + ... + p_k * x^k
Run Code Online (Sandbox Code Playgroud)

如果你有一个数字b并在基础上扩展它n,那么你得到

b = b_0 + b_1 * n + b_2 * n^2 + ...
Run Code Online (Sandbox Code Playgroud)

其中每个b_i都是唯一确定的b_i < n.

  • 凉.您正在利用所有数量都是非负整数的事实.我本以为我们需要和学位一样多的电话.我相信这是实值系数的情况. (5认同)
  • 我会试着解释一下.假设poly = 4x ^ 3 + 3x ^ 2 + x + 2,只是为了简化参数.如果你做poly(1),它给你多项式系数的总和,因为你只做4*1 ^ 3 + 3*1 ^ 2 + 1*1 + 2.因为所有系数都是非负的,你知道poly(1)+ 1>任何系数本身.既然你对此有信心,你可以继续做poly(M),其中M = poly(1)+ 1.这将给你4*M ^ 3 + 3*M ^ 2 + 1*M ^ 1 + 2*M ^ 0.这看起来像基数的定义,基数M(如二进制是基数2,十六进制是基数16等).继续... (4认同)
  • 好.那么我怎么想到这样做呢? (4认同)
  • 那太聪明了!+1肯定. (3认同)