01 完善程序
【第一题】(判断平方数)问题:给定一个正整数n,希望判断这个数是否为完全平方数,即存在一个正整数x使得x的平方为n。
做题前分析
从算法角度来说,只要计算√n的平方是否等于n就能确定n是否为平方数。但是题目代码使用了枚举法,如果在1~√n中有数字的平方等于n,那么n才是平方数。
1、①处应填( )?
A、1
B、2
C、3
D、4
解析:对循环变量i的初始化值,枚举起点为0或1。
2、②处应填( )?
A、(int)floor(sqrt(num))-1
B、(int)floor(sqrt(num))
C、floor(sqrt(num/2))-1
D、floor(sqrt(num/2))
解析:枚举的边界应该到√n,排除C和D。floor为向下取整,但是不需要-1,否则例如判断9是否为平方数,枚举的边界就是2而不是3了。
3、③处应填( )?
A、num = 2 * i
B、num == 2 * i
C、num = i * i
D、num == i * i
解析:如果枚举中某个的i的平方为num,那么num就肯定是平方数。
4、④处应填( )?
A、num = 2 * i
B、num == 2 * i
C、true
D、false
解析:此处应该填判断是平方数的情况,返回true。
但是A作为赋值语句,其返回值为num被赋的值,而程序中明确i>=1,因此num不为0,再加上函数类型为bool型,因此该赋值语句的返回值也是true。因此答案选A和C都可以。
5、⑤处应填( )?
A、num == i * i
B、num != i * i
C、true
D、false
解析:此处是枚举完毕后不存在i的平方等于num,返回false。
02 完善程序
【第2题】(汉诺塔问题)给定三根柱子,分别标记为A、B和C。初始状态下,柱子A上有若干个圆盘,这些圆盘从上到下按从小到大的顺序排列。任务是将这些圆盘全部移到柱子C上,且必须保持原有顺序不变。在移动过程中,需要遵守以下规则:
1.只能从一根柱子的顶部取出圆盘,并将其放入另一根柱子的顶部。
2.每次只能移动一个圆盘。
3.小圆盘必须始终在大圆盘之上。
试补全程序。
做题前分析
汉诺塔问题是非常经典的递归问题。设柱子为A、B、C。
◆ 如果只有1个圆盘,那么直接A → C即可;
◆ 如果有2个圆盘,那么较小的圆盘先A → B,较大的圆盘再A → C,较小的圆盘最后A → C。
借助递推的思想,我们可以推导出:
如果有n个圆盘,那么前n-1个较小的圆盘先A → B,第n个最大的圆盘A → C,前n-1个较小的圆盘最后B → C。其中前n-1个较小的圆盘如何从A → B,就可以递归调用前面的方法来进行。
1、①处应填( )?
A、0
B、1
C、2
D、3
解析:这里是递归的边界情况,即只有一个圆盘时。
2、②处应填( )?
A、src, tmp
B、src, tgt
C、tmp, tgt
D、tgt, tmp
解析:只有一个圆盘,那么直接从A柱(src)挪到C柱(tgt)即可。
3、③处应填( )?
A、src, tmp, tgt
B、src, tgt, tmp
C、tgt, tmp, src
D、tgt, src, tmp
解析:首先要明白dfs()各参数的含义,i为圆盘个数,src为起点,tmp是过渡柱,tgt为终点。
此处为将n-1个圆盘从A → B,即从src到tmp,过渡柱为C,即tgt,因此参数顺序分别为src、tgt、tmp。
4、④处应填( )?
A、src, tmp, tgt
B、tmp, src, tgt
C、src, tgt, tmp
D、tgt, src, tmp
解析:同下一题
5、⑤处应填( )?
A、0
B、1
C、i-1
D、i
解析:此处为将n-1个圆盘从B → C,即从tmp到tgt,过渡柱为A,即src,因此参数顺序分别为tmp、src和tgt,圆盘数量是n-1个。