2023 年 12 月 GESP C++ 三级试卷解析

1.  单选题(每题 2 分,共 30 分)
1 下面 C++ 数组的定义中,会丢失数据的是 ( )
A. char dict_key[] = {'p','t','o'};
B. int dict_value[] = {33,22,11};
C. char dict_name[]={'chen','wang','zhou'};
D. float dict_value[]={3,2,1};
答案[C ]
   
2 在下列编码中,不能够和二进制 "1101 1101" 相等的是 ( )
A. 221 10 进制
B. 335 8 进制
C. dd 16 进制
D. 5d 16 进制
答案[D ]
      
3 下面 C++ 代码执行后不能输出 "GESP" 的是( )
A. string str("GESP"); cout<<str<<endl;
B. string str="GESP"; cout<<str<<endl;
C. string str("GESP"); cout<<str[1]<<str[2]<<str[3]<<str[4]<<endl;
D. string str{"GESP"}; cout<<str<<endl;
答案[C ]
    
4 执行下面 C++ 代码输出是( )。
A. 10
B.
C. 4
D. 3
答案[ C]
    
5 执行下面 C++代码后,输出是( )。
A. 4
B. 2
C. 5
D. 3
答案[C ]
       
6 执行下面 C++ 代码后输出的是( )。
A. 4
B. 3
C. 2
D. 5
答案[ A]
       
7 执行下面 C++ 代码后输出的是( )。
A. 输出未知的数
B. 输出 'n'
C. 输出 '\0'
D. 输出空格
答案[ A]
      
8 下面 C++ 代码执行后的输出是( )。
A. 0
B. 1
C. 输出空格
D. 什么也不输出
答案[D ]
       
9 下面 C++ 代码用于统计每种字符出现的次数,当输出为 3 时,横线上不能填入的代码是( )。
A. str[i]=='o'
B. str[i]=='a'+14
C. str[i]==115
D. str[i]==111
答案[C ]    
        
10 题 32位计算机中, C++ 的整型变量 int 能够表示的数据范围是( )。
A. 2^31~(2^31)-1
B. 2^32
C. -2^31~+(2^31)-1
D. -(2^31)+1~2^31
答案[ C]
    
11 下面 C++ 程序执行的结果是( )。
A. 2
B. 3
C. 5
D. 4
答案[A ]
     
12 C++ 的数据类型转换让人很难琢磨透,下列代码输出的值是( )。
A. 1.5
B. 1
C. 2
D. 1.50
答案[B ]
    
     
13 C++代码用于抽取字符串中的电话号码。约定:电话号码全部是数字,数字之间没有其他符号如连字符或 空格等。代码中变量 strSrc 仅仅是示例,可以包含更多字符。下面有关代码说法,正确的说法是( )。
A. 代码将换行输出各个含有数字的电话号码。
B. 代码将不换行输出各个含有数字的电话号码,号码中间没有分隔。
C. 代码将不换行输出各个含有数字的电话号码,号码中间有分隔。
D. 不能够输出数字电话号码。
    答案[ A]
    
14 某公司新出了一款无人驾驶的小汽车,通过声控智能驾驶系统,乘客只要告诉汽车目的地,车子就能自动
选择一条优化路线,告诉乘客后驶达那里。请问下面哪项不是驾驶系统完成选路所必须的。( )
A. 麦克风
B. 扬声器
C. 油量表
D. 传感器
答案[ C]
 
     
15 现代计算机是指电子计算机,它所基于的是( )体系结构。
A. 艾伦 · 图灵
B. · 诺依曼
C. 阿塔纳索夫
D. 埃克特 - 莫克利
答案[ B]
    
2 判断题(每题 2 分,共 20 分)
1 执行 C++ 代码 cout<<(5&&2)<<endl; 后将输出 1 ( )
答案[T ]
   
    
2 C++ 程序执行后,输入 chen a dai 输出应该为: chen 。( )
答案[ T]
   
3 执行 C++ 代码 cout<<(5||2); 后将输出 1 。( )
答案[ T]
       
4 执行下面 C++ 代码后将输出 "China" 。( )
答案[T ]
     
5 执行 C++ 代码将输出 0 5 5 之后还有一个空格。( )
答案[ F]
       
6 下面 C++ 代码将输出 1 ( )
答案[ F]  
    
7 下面 C++ 程序将输出 1 。( )
答案[ T]
         
8 执行 C++ 代码,将输出 1 3 5 7 9 9 之后还有一个空格。( )
答案[ T]
       
9 小杨最近在准备考 GESP ,他用的 Dev C++ 来练习和运行程序,所以 Dev C++ 也是一个小型操作系统。( )
答案[ F]  
        
10 任何一个 while 循环都可以转化为等价的 for 循环( )。
答案[T ]
       
3 编程题(每题 25 分,共 50 分)
编程题 1
试题名称 :小猫分鱼
时间限制 1.0 s
内存限制 128.0 MB
问题描述
海滩上有一堆鱼,N 只小猫来分。第一只小猫把这堆鱼平均分为N 份,多了 i<N个,这只小猫把多的 i个扔入海 中,拿走了一份。第二只小猫接着把剩下的鱼平均分成N 份,又多了 i个,小猫同样把多的i 个扔入海中,拿走了一 份。第三、第四、 …… ,第 N只小猫仍是最终剩下的鱼分成N 份,扔掉多了的 i个,并拿走一份。
编写程序,输入小猫的数量N 以及每次扔到海里的鱼的数量i ,输出海滩上最少的鱼数,使得每只小猫都可吃到鱼。
例如:两只小猫来分鱼 N=2,每次扔掉鱼的数量为i=1 ,为了每只小猫都可吃到鱼,可令第二只小猫需要拿走 1条 鱼,则此时待分配的有 3条鱼。第一只小猫待分配的鱼有 3*2+1=7条。
输入描述
总共 2 行。第一行一个整数N ,第二行一个整数i 。
保证0<N<10 ;i<N。
输出描述
一行一个整数,表示满足要求的海滩上最少的鱼数。
特别提醒
在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任 何提示信息。
样例输入 1
2 1
样例输出 1
7
样例输入 2
3 1
样例输出 2
25
样例解释 2
三只小猫来分鱼N=3,每次扔掉鱼的数量为i=1,为了每只小猫都可吃到鱼,可令第三只小猫需要拿走 3条鱼(拿 走 1 条和 2 条不满足要求),则此时待分配的有 10 条鱼。第二只小猫待分配的鱼有
10*3/2+1=16条。第一只小猫 待分配的鱼有 16*3/2+1=25条。
参考程序:
递推
思路:
枚举最后一只猫拿走的鱼i,i>=1,从小到大枚举,最后一只猫拿走鱼之前待分配鱼的数量为ans=i*3+a,扔掉的鱼的数量为a,倒数第二只猫待分配的鱼的数量设为y,则(y-a)*(n-1)/n=ans,则y=ans/(n-1)*n+a;
状态:f(j)表示第j只猫拿走鱼之前待分配的鱼的数量 
初始值:f(n)= i*n+a;
递推关系式:f[j-1]=f[j]/(n-1)*n+a; 
注意:由第j只猫待分配鱼的数量f[j]是第j-1只猫待分配的鱼的数量f[j-1]扔掉a个后的(n-1)份,所以
第j只猫的待分配数量f[j]必须是(n-1)的整数倍才是合理的。
#include<iostream>
using namespace std;
int f[20];   //f[i]第i只猫拿走鱼之前的待分配鱼数 
int main(){
    int n,a;
	cin>>n>>a;
	//枚举最后一只猫拿走的鱼数
	for(int i=1;;i++){
		int flag=1;//n只小猫都成功分到了鱼 
		f[n]=i*n+a;  //第n只猫待分配的鱼数
		//从倒数第2只到第一只
		for(int j=n;j>=2;j--){
			if(f[j]%(n-1)==0){//如果符合条件
				f[j-1]=f[j]/(n-1)*n+a;
			}else{
				flag=0; 
				break;
			}		
		} 
		if(flag==1){
			cout<<f[1];
			return 0;
		}
	} 
	return 0;
}

编程题 2
试题名称 :单位转换
时间限制 1.0 s
内存限制 128.0 MB
问题描述
小杨这周的数学作业是做单位转换,喜欢编程的小杨决定编程帮他解决这些问题。
小杨只学了长度单位和重量单位,具体来说:
长度单位包括千米( km )、米( m )、毫米( mm ),它们之间的关系是:1km=1000m=1000000mm。
重量单位包括千克( kg )、克( g )、毫克( mg ),它们之间的关系是:
1kg=1000g=1000000mg。
小杨的作业只涉及将更大的单位转换为更小的单位,也就是说,小杨的作业只会包含如下题型:米转换为毫米,千 米转换为毫米,千米转换为米,克转换为毫克,千克转换为毫克,千克转换为。
现在,请你帮忙完成单位转换的程序。
输入描述
输入的第一行为一个整数 ,表示题目数量。
接下来 行,每行一个字符串,表示转换单位的题目,格式为 x 单位 1 = ? 单位 2 。其中, x 为一个不超过1000的非负整数, 单位 1 单位 2 分别为两个单位的英文缩写,保证它们都是长度单位或都是重量单位,且 单 位 1 单位 2 更大。
例如,如果题目需要你将1km转换为mm,则输入为 1 km = ? mm
保证1<=N<=1000。
输出描述
输出 行,依次输出所有题目的答案,输出时,只需要将输入中的 ? 代入答案,其余部分一字不差地输出即可。
由于小杨的题目只涉及将更大的单位转换为更小的单位,并且输入的 x 是整数,因此答案一定也是整数。
例如,如果题目需要你将1km转换为mm,,输入为 1 km = ? mm ,则你需要输出 1 km = 1000000 mm
特别提醒
在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任 何提示信息。 输入格式将严格按照题目要求,且你的输出必须和标准答案完全一致才能得分,请在提交前仔细检 查。
样例输入 1
2
1 km = ? mm
1 m = > mm
样例输出 1
1 km = 1000000 mm
1 m = 1000m
样例输入 2
5
100 m = ? mm
1000 km = ? m
20 kg = ? g
200 g = ? mg
0 kg = ? mg
样例输出 2
100 m = 100000 mm
1000 km = 1000000 m
20 kg = 20000 g
200 g = 200000 mg
0 kg = 0 mg
参考程序:
循环+判断
#include <bits/stdc++.h>
using namespace std;
int main() {
    int n;
    long long k, ans;
    string a, b;
    char c;
    cin >> n;
    for(int i = 1; i <= n; i++) {
        cin >> k >> a >> c >> c >> b;
        if (a == "g") {
            if (b == "kg") {
                ans = k / 1000;
            } else if(b == "mg") {
                ans = k * 1000;
            } else {
                ans = k;
            }
        } else if(a == "kg") {
            if (b == "g") {
                ans = k * 1000;
            } else if(b == "mg") {
                ans = k * 1000000;
            } else {
                ans = k;
            }
        } else if(a == "mg") {
            if (b == "g") {
                ans = k / 1000;
            } else if(b == "kg") {
                ans = k / 1000000;
            } else {
                ans = k;
            }
        } else if (a == "m") {
            if (b == "km") {
                ans = k / 1000;
            } else if(b == "mm") {
                ans = k * 1000;
            } else {
                ans = k;
            }
        } else if(a == "km") {
            if (b == "m") {
                ans = k * 1000;
            } else if(b == "mm") {
                ans = k * 1000000;
            } else {
                ans = k;
            }
        } else if(a == "mm") {
            if (b == "m") {
                ans = k / 1000;
            } else if(b == "km") {
                ans = k / 1000000;
            } else {
                ans = k;
            }
        }
        cout << k << " " << a << " = " << ans << " " << b << endl;
    }
    return 0;
}

  • 37
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值