[全网最详细]CSP-J 2024普及组初赛题详解与知识点剖析—完善程序

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个。


原文链接:,转发请注明来源!