第五套中小学信息学奥赛CSP-J考前冲刺题
二、阅读程序题
(程序输入不超过数组或字符串定义的范围,判断题正确填√错误填X;除特殊说明外,判断题 1.5分,选择题3分,共计40分)
第一题 递归函数
1 #include<iostream>
2 using namespace std;
3 int p;
4 void fun(int &x,int &y);
5 void func (int &x,int &y){
6 if(y>x)return;
7 x--;y/=2;
8 fun(x,y);
9 }
10 void fun(int &x,int &y){
11 if(x==1)return;
12 x/=2;y+=p;
13 func(x,y);
14 }
15int main(){
16 int x,y;
17 cin>>x>>y>>p;
18 fun(x,y);
19 cout<<x<<' '<<y;
20 return 0;
21 }
程序分析
主要考查小朋友们读写程序能力和逻辑思维能力,此程序实现的是一个C++递归函数程序,主要功能是通过递归调用函数来操作输入的两个数x和y,最终输出最终的x和y的值。
- 程序的主要部分如下: 声明了一个全局变量p
- 定义了两个函数fun和func
- 函数fun通过引用参数传递x和y的值,并且检查x是否等于1,如果是,则函数返回
- 否则,将x除以2,y加上p的值,并调用函数func
- 函数func通过引用参数传递x和y的值,并且检查y是否大于x,如果是,则函数返回
- 否则,将x减1,y除以2,并调用函数fun
- 在主函数main中,首先输入x、y和p的值,然后调用函数fun,并输出最终的x和y的值
判断题
1)、将第 04行的&去除后,程序仍能通过编译
2)、读人的x,y,p为int 范围内任意值时程序均能完成运行
3)、若x=1时,输出的x,y与输人的一致
4)、输出的x必然小于等于输人的x。
答案:1 × 2 × 3 √ 4 ×
答案分析:
1、从程序中可以看出第4行是函数声明,第10行是对应函数的定义,这两行参数应该要保持一致,错误
2、当x、y、p均为-3的时候,程序就进入死循环,错误
3、从程序第11行可以看出,如果输入的x=1,将直接返回,所以输出和输入的xy一致,正确
4、从程序分析可以看出,如果输入的x为负数的时候就不一定了,错误
单选题
5)、输人为7 33 2时,输出为
A、4 31
B、4 35
C、3 31
D、3 35
答案:D
答案分析:从程序分析,然后带入输入对应的值,可以计算得到输出的x和y为:3和35,答案D
6)、输人为33 7 2时,输出为
A、5 3
B、3 5
C、6 4
D、4 6
答案:B
答案分析:从程序分析,然后带入输入对应的值,可以计算得到输出的x和y为:3和5,答案B
第二题 素数判定
1 #include<iostream>
2 using namespace std;
3 #include<cmath>
4
5 bool IsPrime(int num)
6 {
7 for(int i=2;i<=sqrt(num);i++)
8 {
9 if(num%i==0)
10 {
11 return false;
12 }
13 }
14 return true;
15 }
16 int main()
17 {
18 int num=0;
19 cin>>num;
20 if(IsPrime(num))
21 {
22 cout<<"YES"<<endl;
23 }
24 else
25 {
26 cout<<"NO"<<endl;
27 }
28
29 return 0;
30 }
程序分析
主要考查小朋友们读写程序能力和逻辑思维能力,此程序实现判断一个给定的数是否为素数
- 首先,定义了一个名为IsPrime的函数,用于判断一个数是否为素数
- 该函数接收一个整数参数num
- 在IsPrime函数内部,使用一个for循环从2开始遍历到sqrt(num),用于判断num是否可以被整除
- 通过判断num%i是否等于0,如果等于0,则表示num可以被i整除,即num不是素数,返回false
- 如果循环结束后仍然没有返回false,表示num不能被2到sqrt(num)之间的任意整数整除,即num是素数,返回true
- 在main函数中,首先定义了一个变量num用于接收用户输入的数
- 然后通过cin语句从标准输入读取一个整数,存入num变量中
- 接下来通过调用IsPrime函数判断num是否为素数
- 如果是素数,则输出"YES",否则输出"NO"
- 最后返回0,表示程序执行成功
判断题
1)、第19行输人 97时,输出为“NO”(不含引号)
2)、第19 行输人 119时,输出为“YES”(不含引号)
3)、若将第7行的“<="改成“<”,程序输出的结果一定不会改变
4)、当程序执行第14行时,i的值为 sqrt(num)。
答案:1× 2 × 3 √ 4 ×
答案分析:
1、从程序分析可以得出97是素数,输出为YES,错误
2、从程序分析可以得出119不是素数,119=7*17,输出为NO,错误
3、从程序分析中可以看出,如果一个数为质数的平方,这时候就会判断出错,错误
4、从for循环中可以看出,要执行14行,必须是for循环全部执行完毕,i的值应该是sqrt(num)+1,错误
单选题
5)、最坏情况下,此程序的时间复杂度是
A、O(num)
B、O(num^2)
C、O(sqrt(num))
D、O(log num)
答案:C
答案分析:从for循环中可以看出,最坏的情况就是i=sqrt(n),所以最坏情况下时间复杂度为O(sqrt(n)),答案C
6)、若输人的num为 20以内的正整数,则输出为“YES"的概率是
A、0.45
B、0.4
C、0.5
D、0.35
答案:A
答案分析:从程序分析中可以看出,20以内的素数有:2、3、5、7、11、13、17、19,共8个,但是如果输入的是1,也会输出YES,所以共有9个数,9/20=0.45,答案A
第三题 数字排序
1 #include<iostream>
2 using namespace std;
3 const int maxn=105;
4 int n,a[maxn],b[maxn];
5 int main()
6 {
7 cin>>n;
8 int x;
9 for(int i=1;i<=n;i++){
10 cin>>x;
11 a[i]=b[i]=x;
12 }
13
14 for(int i=1;i<=n;i++)
15 for(int j=i+1;j<=n;j++){
16 if (a[i]>a[j]) swap(a[i],a[j]);
17 if (b[i]<b[j]) swap (b[i],b[j]);
18 }
19
20 for (int i=1;i<=n;i++)cout<<a[i]<<" ";
21 cout<<"\n" ;
22 for (int i=1;i<=n;i++)cout<<b[i]<<" ";
23 cout<<"\n";
24 return 0;
25 }
程序分析
主要考查小朋友们读写程序能力和逻辑思维能力,这段程序实现的功能是对输入的n个数字进行排序,并输出两种排序的结果
- 程序首先读取输入的n,并声明了两个大小为maxn的数组a和b用于存储输入的数字
- 程序接着通过for循环将输入的数字依次赋值给a和b数组
- 然后,程序使用两层嵌套的for循环进行排序
- 内层的for循环从i+1开始,遍历剩下的数字,通过比较大小来交换位置,使得a[i]的值最小,b[i]的值最大
- 最后,程序使用两个for循环分别输出a和b数组的元素
- 时间复杂度分析: 最坏情况下,内层for循环的执行次数为(n-1)+(n-2)+...+1 = (n-1)*n/2,所以时间复杂度为O(n^2)。 因此,整个程序的时间复杂度为O(n^2)。
判斯题
1) 若输人的 X[1],X[2],…,X[N]中有相同的数,程序会陷人死循环
2) 当且仅当输入的X[1],X[2],…,X[N]全部相同时输出的两行结果相同
3) 该算法的原理是基数排序
答案:1× 2√ 3 ×
答案分析:
1、从程序分析可以得出这是实现排序,第一行是从小到大,第二行是从大到小,有相同的数也不影响排序结果,错误
2、从程序分析可以得出只有输入都是一样的时候结果才会相同,正确
3、以上程序的算法原理是选择排序。基数排序是一种非比较排序算法,而选择排序是一种比较排序算法。在基数排序中,根据数字的每一位进行排序;而在选择排序中,通过每次选择最小(或最大)的元素,将其放在已排序部分的末尾。错误
单选题
4) 若输人的X[1],X[2],…,X[N]互不相同,则下列说法正确的是
A、输出的两行结果相同
B、将输出的第一行结果整体翻转后,将与第二行相同
C、将输出的第一行结果的第一项与最后一项交换后,将与第二行相同
D、以上说法都不正确
答案:B
答案分析:程序分析可以得出第一行是从小到大排序,第二行是从大到小排序,答案B
5) 下列说法不正确的是
A、输出的第一行即为将 X[1],X[2],…,X[N]从小到大排序后得到的结果
B、输出的第二行即为将 X[1],X[2],…,X[N]从大到小排序后得到的结果
C、若将“a[i]>a[j]"改为“a[i]>=a[j]”,则程序输出无变化
D、不存在时间复杂度更优的能与本程序达到相同目的算法
答案:D
答案分析:因为输出的结果中有B和C,所以输入的字符串就是S和P,所以答案A
6) 该程序的时间复杂度为
A、O(n)
B、O(n log n)
C、O(n^2)
D、O(n sqrt(n))
答案:C
答案分析:从程序分析可以得出该程序的时间复杂度为C