课后练习 1.1

个人做的课后练习

书籍:算法设计与分析基础(第三版)

习题1.1

二.
这个问题,在百度上也有答案的。好像是据说,算法本身就无法申请专利的,但是,如果实例化之后(大概就是做出了实体)就可以申请该项的专利。(此处不包括 加密算法)

四. 乘法运算来考虑的话:

Sqrt(n)
 for ii to n do
     if i*i > n
         return i-1
加法运算来考虑的话:
注意到完全平方数之间的规律:

1—4—9—16—25—36—49—(下面是之间的差)
—3—5—7—9—11—-13—-15—
完全可以使用加法替代乘法运算

Sqrt(n)
 number0
 for i←1 to n do
    numbernumber+i+i-1
    if number > n 
        return i-1 

目测上,虽然加法比较复杂,但是相对来说加法的效率应该要高效一点。

五.

Output(A,B,m,n)
 ij←k←0
 while ijif  A[i]>B[j]
      j++
  else if A[i]==B[j]
      C[k++]←A[i]
      i++
      j++
  else
      i++
 return C 

最小的比较次数 min(n,m)
最大的比较次数 n+m

七.
假设 k 是 m,n的最小公约数,显然有:
m = i*k
n = j*k
m ÷ n = (i/j)*k ······ ( i-(i/j) )*k

八.
多一次

九.
a.最少两次
b.最多五次 gcd(13,8)
分析:因为要尽可能的多次操作,所以,这两个数必须是互质,并且这两个数,尽量由一些质数相加而得来的。
逆推:
1 , 2
3 , 2
3 , 5
8 , 5
8,13

十.
b.
逆向思考和分析问题,假设,两个数分别为 m,n 我们肯定可以求得 q = gcd(m,n),所以,我们可以产生 m/q -2 个不同的正整数(除去了 m和 n),既我们只需要判断 m/q 是奇数还是偶数 就可以判断出先行动获胜 还是 后行动获胜

十一.
a.
分析式子 mx+ny=d
假设 m = i*d,n = j*d
所以有 xi + yj = 1
进一步化简
x = (1-yj)/i
显然 i 和 j 都是确定的数字,而且 1-yj 是 i 的整数倍
我们只需要 不断的对 y进行自增或者自减,就可以得出结果
(后来我又考虑了一下,我发现可以理解成为两个等差数列求公共项对应的序列数
第一个数列是: A=i * x
第二个数列是: B=1 - j*y
显然,公共数列也是一个等差数列,公差为 lcm(i,j)
所以只需要用枚举的方法计算出第一个公共项的值,每次公共项增加或者减少 lcm(i,j)的倍数,就可以快速把所有的解求出来)
b.
和a分析类似

十二.
判断灯是开的还是关的,只需要判断拉动了开关是奇数次还是偶数次。
是奇数则是开的,是偶数则是关的。
分析任意一个自然数:
显然一般自然数的因子都是成对出现的。
例如:8=1 * 8 = 2 * 4
而当自然数是完全平方数的时候,因子会发生重复。
例如 : 25 = 1 * 25 = 5 * 5
所以,显然得出结论:
除了是完全平方数的灯,其他灯都是关上的。

你可能感兴趣的:(算法设计与分析基础)