2024CCF认证第一轮(CSP-J)真题
三、完善程序题
第一题 判断平方数
问题:给定一个正整数 n,判断这个数 是不是完全平方数,即存在一个正整数 x 使得 x 的平方等于 n 试补全程序
#include<iostream>
#include<cmath>
using namespace std;
bool isSquare(int num){
int i = (1);
int bound = (2);
for(;i<=bound;++i){
if( (3) ){
return (4);
}
}
return (5);
}
int main(){
int n;
cin>>n;
if(isSquare(n)){
cout<<n<<" is a Square number"<<endl;
}else{
cout<<n<<" is not a Square number"<<endl;
}
}
程序分析:此程序的主要思路是,首先定义一个名为isSquare的函数,该函数接受一个整数作为参数,并返回一个布尔值。函数内部使用循环从1开始逐个检查每个数字,直到数字的平方等于给定的整数或超过给定整数的平方根。如果找到平方等于给定整数的数字,函数返回true,否则返回false。 在主函数main中,首先读取一个整数作为输入,然后调用isSquare函数判断该整数是否为完全平方数。如果是,输出该整数是一个完全平方数;如果不是,输出该整数不是一个完全平方数。
单选题
①处应该填
A. 1
B. 2
C. 3
D. 4
答案:A
答案分析:从程序分析中可以得知此处应该是从1开始,答案A
②处应该填
A. (int) floor(sqrt(num)-1)
B. (int) floor(sqrt(num))
C. floor(sqrt(num/2))-1
D. floor(sqrt(num/2))
答案:B
答案分析:从程序分析中可以得知此处应该是自变量的结束条件上限,也就是num的开平方并向下取整,答案B
③处应该填
A. num=2*i
B. num==2*i
C. num=i*i
D. num==i*i
答案:D
答案分析:从程序分析中可以得知此处应该是要判断数字是否是平方数,首先排除A和C,他们是赋值运算;然后应为是要判断平方数,所以答案D
④处应该填
A. num=2*i
B. num==2*i
C. true
D. false
答案:C
答案分析:从程序分析中可以得知此处应该是满足条件要返回true,答案C
⑤处应该填
A. num=i*i
B. num==2*i
C. true
D. false
答案:D
答案分析:从程序分析中可以得知此处应该是不满足条件要返回false,答案D
第二题 汉诺塔问题
给定三根柱子,分别标记为 A、B 和 C。初始状态下,柱子 A 上有若干个 圆盘,这些圆盘从上到下按从小到大的顺序排列。任务是将这些圆盘全部移到柱子 C 上,且 必须保持原有顺序不变。在移动过程中,需要遵守以不规则:
- 只能从一根柱子的顶部取出圆盘,并将其放入另一根柱子的顶部。
- 每次只能移动一个圆盘
- 小圆盘必须始终在大圆盘之上。
#include <bits/stdc++.h>
using namespace std;
void move(char src, char tgt) {
cout << "从柱子" << src << "挪到柱子上" << tgt << endl;
}
void dfs(int i, char src, char tmp, char tgt) {
if(i == (1) ) {
move( (2) );
return;
}
dfs(i-1, (3) );
move(src, tgt);
dfs( (5) , (4) );
}
int main() {
int n;
cin >> n;
dfs(n, 'A', 'B', 'C');
}
程序分析:此程序利用深搜DFS实现汉诺塔,
- 首先,定义了两个函数: void move(char src, char tgt):用于输出移动的步骤,将一个盘子从源柱子(src)移动到目标柱子(tgt)。
- void dfs(int i, char src, char tmp, char tgt):用于解决汉诺塔问题的递归函数。参数i表示需要移动的盘子数目,src表示源柱子,tmp表示临时柱子,tgt表示目标柱子。
- 在主函数main()中,首先读取需要移动的盘子数目n,并调用dfs(n, 'A', 'B', 'C')来解决汉诺塔问题。
- dfs函数的实现: 首先,判断如果只有一个盘子需要移动(i==1),则直接调用move函数将盘子从src移动到tgt。
- 否则,递归调用dfs函数: 第一步,将i-1个盘子从src借助tgt柱子移动到tmp,此时的参数为dfs(i-1, src, tgt, tmp)。
- 第二步,将最底下的第i个盘子从src移动到tgt,此时调用move(src, tgt)。
- 第三步,将i-1个盘子从tmp借助src柱子移动到tgt,此时的参数为dfs(i-1, tmp, src, tgt)。
- 整个过程可以看作是将i个盘子从src移动到tgt的三个步骤。 递归的结束条件是i==1,即只有一个盘子需要移动,此时直接调用move函数移动盘子。 最终,程序会输出将盘子从源柱子挪到目标柱子的每一步操作。
单选题
①处应该填
A. 0
B. 1
C. 2
D. 3
答案:B
答案分析:从程序分析中可以得知此处应该是剩最后一个盘子,答案B
②处应该填
A. src,tmp
B. src,tgt
C. tmp,tgt
D. tgt,tmp
答案:D
答案分析:从程序分析中可以得知此处应该是最后一个盘子直接从源柱子移动到目标柱子,答案D
③处应该填
A. src,tmp,tgt
B. src, tgt, tmp
C. tgt, tmp, src
D. tgt, src, tmp
答案:B
答案分析:从程序分析中可以得知此处应该是从源柱子借助目标柱子移动到临时柱子,答案B
④处应该填
A. src,tmp,tgt
B. tmp, src, tgt
C. src, tgt, tmp
D. tgt, src, tmp
答案:B
答案分析:从程序分析中可以得知此处应该是将之前在临时柱子上的盘子借助源柱子移动到目标柱子,答案B
⑤处应该填
A. 0
B. 1
C. i-1
D. i
答案:C
答案分析:从程序分析中可以得知此处应该是之前i-1个柱子需要先移到临时柱子上,所以答案C