Adobe的一道笔试题

发表于:2010-07-08来源:作者:点击数: 标签:笔试Adobe
Adobe的一道笔试题 软件测试 {f(n), f(n-1), f(n-1), f(n-2)} ={1, 1, 1,0}n-1 (注:{f(n+1), f(n), f(n), f(n-1)}表示一个矩阵。在矩阵中第一行第一列是f(n+1),第一行第二列是f(n),第二行第一列是f(n),第二行第二列是f(n-1)。) 有了这个公式,要求得f(n)

  Adobe的一道笔试题   软件测试

  {f(n), f(n-1), f(n-1), f(n-2)} ={1, 1, 1,0}n-1

  (注:{f(n+1), f(n), f(n), f(n-1)}表示一个矩阵。在矩阵中第一行第一列是f(n+1),第一行第二列是f(n),第二行第一列是f(n),第二行第二列是f(n-1)。)

  有了这个公式,要求得f(n),我们只需要求得矩阵{1, 1, 1,0}的n-1次方,因为矩阵{1, 1, 1,0}的n-1次方的结果的第一行第一列就是f(n)。这个数学公式用数学归纳法不难证明。感兴趣的朋友不妨自己证明一下。

  现在的问题转换为求矩阵{1, 1, 1, 0}的乘方。如果简单第从0开始循环,n次方将需要n次运算,并不比前面的方法要快。但我们可以考虑乘方的如下性质:

  / an/2*an/2 n为偶数时

  an=

  \ a(n-1)/2*a(n-1)/2 n为奇数时

  要求得n次方,我们先求得n/2次方,再把n/2的结果平方一下。如果把求n次方的问题看成一个大问题,把求n/2看成一个较小的问题。这种把大问题分解成一个或多个小问题的思路我们称之为分治法。这样求n次方就只需要logn次运算了。

  实现这种方式时,首先需要定义一个2×2的矩阵,并且定义好矩阵的乘法以及乘方运算。当这些运算定义好了之后,剩下的事情就变得非常简单。完整的实现代码如下所示。

  #include

  ///////////////////////////////////////////////////////////////////////

  // A 2 by 2 matrix

  ///////////////////////////////////////////////////////////////////////

  struct Matrix2By2

  {

  Matrix2By2

  (

  long long m00 = 0,

  long long m01 = 0,

  long long m10 = 0,

  long long m11 = 0

  )

  :m_00(m00), m_01(m01), m_10(m10), m_11(m11)

原文转自:http://www.ltesting.net