一、单选题(每题2分,共30分)
题目 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
答案 | B | C | A | D | C | B | C | C | A | D | D | C | D | C | B |
1.下列代码中,输出结果是( )
#include<iostream>
using namespace std;
int main()
{
double a=0.9;
double b=1.0;
if(((b-a)==0.1))
{
cout<<"Equal"<<endl;
}
else
{
cout<<"Not equal"<<endl;
}
}
A. Equal
B. Not equal
C. 程序不能正确执行
D. 没有输出
【答案】B
【考纲知识点】
【解析】考察浮点数知识题目,浮点数在计算机中是以二进制形式存储的,而某些十进制小数无法精确表示成二进制小数。因此,在进行浮点数运算时可能会出现微小的舍入误差。例如,0.9和0.1都无法在二进制下精确表示,这可能导致b - a的结果不完全等于0.1,因此选择B选项。
2.关于计算机中的编码,下列说法中正确的是()
A. 机器数的形式值和真值是一致的
B. 原码就是符号位加上真值
C. 机器数是带符号的
D. [-1]=[1000 0001]原=[1111 1111]反
【答案】C
【考纲知识点】
【解析】计算机基础知识题目,对于正数形式值和真值相等,如果是负数有符号位的区别并不一致,原码应是符号位加上形式值,-1的原码表示正确,但是反码应该是1111 1110,因此选择C选项。
3. 8进制数3703转换成16进制数是()
A.7C3
B.7A3
C.7B3
D.7D3
【答案】A
【考纲知识点】
【解析】进制转换知识题目,可以采用常规方法,先将八进制3703转换成十进制,再转换为十六进制,也可采用快捷方法利用一分三的技巧将3703转二进制,再利用四合一技巧转换为十六进制,最终结果是7C3,因此选择A选项。
4.0.8125变成二进制是( )。
A. 0.1110
B. 0.1 1111 1011 1101
C. 0.1 1111 1011 1100
D. 0.1101
【答案】D
【考纲知识点】
【解析】考察浮点数进制转换知识题目,将十进制小数转换为二进制小数可以采用不断的乘以2并且记录每次乘积的整数部分来完成,0.8125*2=1.625整数部分为1,0.625*2=1.25整数部分为1,0.25*2=0.5整数部分为0,0.5*2=1整数部分为1,最终是0.1101,因此选择D选项。
5.下面说法正确的是( )
A. (22&01)==(22&&01)成立
B. (23|11)==30
C. (23|10)==31
D. (23|01)==31
【答案】C
【考纲知识点】
【解析】考察位运算知识题目,a选项计算后左侧为false右侧为true所以是不成立的,b选项计算结果应为31即(10111)|(1011),c选项正确,d选项计算结果应为0,因此选择C选项。
6.下列说法正确的是()
A. 2>>1和1>>1的值是一样的
B. (2>>2)和(1>>1)的值是一样的
C. (11^00)和(1^0)的值是一样的
D. (~0的输出值是1)
【答案】B
【考纲知识点】
【解析】考察位运算知识题目,a选项计算结果是1和0选项错误,b选项计算结果都为0选项正确,从选项计算结果是11和1选项错误,d选项按位取反,不同类型的输出也不同,对于有符号整数int输出的是-1,因为补码形式是1111 1111,因此选择B选项。
7.下列代码实现的是( )
void Swap(int &a, int &b) {
if (a != b) {
a ^= b;
b ^= a;
a ^= b;
}
}
A. a和b的异或
B. a和b的同或
C. a和b的值交换
D. a和b的高低位互换
【答案】C
【考纲知识点】
【解析】考察位运算知识题目,最终实现效果就是a和b的值互换,此题可以采用举出具体实例的方式求解,可以设置a=2,b=3即a为0010,b为0011,第一步后a为0001,第二步骤后b为0010,第三步骤后a为0011,因此选择C选项。
8.a&~1运算实现的是( )。
A. 使a的最低位为1
B. 使a的最高位为1
C. 使a的最低位为0
D. 使a的最高位为0
【答案】C
【考纲知识点】
【解析】考察位运算知识题目,变量a和~1做按位与操作,常规32位整数下1的最低位是1,取反后最低位为0,a变量最低位无论是1还是0计算结果都会是使最低位为0,因此选择C选项。
9.a=1010 1110,a<<2,下面关于这个说法正确的是 ( )。
A. a的值变为1011 1000
B. a的值变为1011 1010
C. a的值变为0101 1101
D. a的值变为0101 1100
【答案】A
【考纲知识点】
【解析】考察位运算知识题目,此题目直接移动即可,整体左移两位低位补0,最终结果是1011 1000,因此选择A选项。
10.下列程序中,result和result2输出分别是 ( )
long a = 123;
int b = 1;
long result = a & b;
cout<<result<<endl;
long a2 = -123;
unsigned int b2 = -1;
long result2 = a2 & b2;
cout<<result2<<endl;
A. 123 -1
B. 123 -123
C. 1 -1
D. 1 -123
【答案】D
【考纲知识点】
【解析】考察位运算知识题目,首先是a和b做按位与运算,(0111 1011)&(0000 0001)最终结果是1,第二组是a2和b2按位与运算,(0111 1011)&(1111 1111)结果是0111 1011也就是123,因为a2是-123最高位是1,b2是无符号int即所有位数位1的最大值,最高位也为1,相当于符号位计算后也为1,最终是-123,所以选择D选项。
11.陈A歹种植一批农作物,第一天需要浇水一次,随后的两天(第2、第3天),每天需要浇水2次,再随后的3天(第4、第5、第6天),需要每天浇水3次,这样持续下去,随后的n天,每天需要浇水n次。请问在100天里,总
共浇了多少次水( )
A. 994
B. 996
C. 995
D. 945
【答案】D
【考纲知识点】
【解析】考察逻辑运算题目,按照题面描述分阶段第一天浇水次数是1*1次,第二天浇水次数是2*2次...以此类推到所有阶段累加的天数到100天,最终是累加到13的平方和共91天总次数819次,剩余9天第14阶段每天14次再加9*14次共819+126=945次,因此选择D选项。
12.关于一维数组,下列程序能够正确执行的是( )。
A.
int a[10];
int sum=0;
for(int i=0;i<=10;i++) {
sum=sum+a[i];
}
B.
int a[10]={1,2,3,4,5,6,7,8,9,10};
int sum=0;
for(int i=0;i<=10;i++) {
sum=sum+a[i];
}
C.
int a[10]={1,2,3,4,5,6,7,8,9,10};
int sum=0;
for(int i=0;i<10;i++) {
um=sum+a[i];
}
D.
int a[10]={0};
int sum=0;
for(int i=0;i<=10;i++) {
sum=sum+a[i];
}
【答案】C
【考纲知识点】
【解析】考察一维数组知识题目,题目中明显的错误比较容易发现其中ABD三个选项中循环都超范围,设置长度为10数组位置共10个但是下标是0~9不存在a[10]三个选项中都是i<=10,因此选择C选项。
13.下面的程序中,会输出( )。
int a[10]={1,2,3,4,5,6,7,8,9,10};
cout<<a[10]<<endl;
A. 1
B. 0
C. 10
D. 不确定的值
【答案】D
【考纲知识点】
【解析】考察一维数组知识题目,设置长度为10数组位置共10个但是下标是0~9不存在a[10],会输出不确定的值,因此选择D选项。
14.有ABCD4个人,其中一个是小偷,每个人说一句话,只有小偷说的是假话,其中A说:不是我。B说:是C。C说:是D。D说:C瞎说,请问谁是小偷( )。
A. A
B. B
C. C
D. D
【答案】C
【考纲知识点】
【解析】考察逻辑推理知识题目,此题可以采用假设法分别假设四人中的一人是小偷,也就是说的是假话,看是否与另外三人说的话相悖,如果是则排除,如果都不相悖就是小偷,或者其他合理推理方法均可,因此选择C选项。
15.下列程序输出的是()
string str = "Hello,CHAD";
cout << str.find("A") << '\n';
A. 9
B. 8
C. 7
D. 6
【答案】B
【考纲知识点】
【解析】考察字符串汉字字节数知识题目,find函数返回的是字符A的位置,但是前面是一个汉字占用两字节,输出显示的位置会是8并不是7,因此选择B选项。
二、判断题(每题2分,共20分)
题目 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
答案 | √ | √ | √ | √ | × | √ | × | √ | √ | × |
1.+1和-1的原码进行1+(-1)计算的结果是-2 。( )
【答案】正确
【考纲知识点】
【解析】考察编码知识题目,最高位符号位是0+1=1为负数,低位的1+1结果为2,因此题目说法正确。
2.~1 的输出值是 -2 。( )
【答案】正确
【考纲知识点】
【解析】考察编码知识题目,~1可以理解为对0000 0001进行取反1111 1110,这个编码恰好是-2的补码,程序中用补码表示,所以输出值是-2,因此题目说法正确。
3.~1 = 1111 1110 。( )
【答案】正确
【考纲知识点】
【解析】考察编码知识题目,与第二题相同,~1是对0000 0001按位进行取反1111 1110,因此题目说法正确。
4.取 X 的低四位,可以用 Y = 0000 1111 ,用 X&Y 获取 X 的低四位。( )
【答案】正确
【考纲知识点】
【解析】考察位运算知识题目,y = 0000 1111,最低位是四个1,可以通过和1做&运算的结果来判断出x的低四位分别是什么,因此题目说法正确。
5.下列程序输出的是 A 。( )
char x=65;
x++;
cout<<x++<<endl;
【答案】错误
【考纲知识点】
【解析】题面给定的程序中char类型变量x为65,加1后为66由于类型是char类型,输出的内容是字符B并不是A,因此题目说法错误。
6.下列程序输出的是 3 。( )
string str="CHADai";
size_t pos = str.find('D');
cout<<pos<<endl;
【答案】正确
【考纲知识点】
【解析】考察编码字符串知识,下标从0开始汉字两个字节,所以字符A下标是2,字符D下标是3,题面中的size_t通常是无符号整数类型,此处当作int理解即可,不影响题目判断,因此题目说法正确。
7.下列程序将输出 1 。( )
int a[10]={1};
cout<<a[1]<<endl;
【答案】错误
【考纲知识点】
【解析】考察数组知识,题面中这种数组初始化方式,是将a[0]设置为1,其余位置都是0填充,所以应该是输出0而不是1,因此题目说法错误。
8.下列程序将输出 A 。( )
int a=65;
cout<<(char)a<<endl
【答案】正确
【考纲知识点】
【解析】考察数据类型转换知识,题目中的65转换成字符char类型,对应ASCII码关系,对应字符A,因此题目说法正确。
9.16进制数 AB ,表示成2进制数是 10101011 。( )
【答案】正确
【考纲知识点】
【解析】考察进制转换知识,将十六进制数字转换成二进制可以采用一分四的方式,A对应1010,B对应1011,因此题目说法正确
10.def (十六进制) = 103231 (五进制)。( )
【答案】错误
【考纲知识点】
【解析】考察进制转换知识,def转换为十六进制可以先将十六进制转换为十进制,再将十进制转换成五进制,def分别对应13、14、15,转为十进制是13*16²+14*16+15*1=3567,转为五进制后是103232,题目中103231最后一位书写错误,因此题目说法错误。
三、编程题(每题25分,共50分)
1、平衡序列
【问题描述】
小杨有一个包含n个正整数的序列a,他认为一个序列是平衡的当且仅当存在一个正整数i(1≤ i<n)使得序列第1个到第i个数字的总和等于第i+1个到第n个数字的总和。
小杨想请你判断序列a是否是平衡的。
【输入描述】
第一行包含一个正整数t,代表测试用例组数。
接下来是t组测试用例。对于每组测试用例,一共两行。
第一行包含一个正整数n,代表序列长度。
第二行包含n个正整数,代表序列a。
【输出描述】
对于每组测试用例,如果序列a是否是平衡的,输出Yes,否则输出No。
【样例输入 1】
3
3
1 2 3
4
2 3 1 4
5
1 2 3 4 5
【样例输出 1】
Yes
Yes
No
【题目大意】
【考纲知识点】
【解题思路】
根据题面描述的要求,先按着数据组数设置好循环次数,即t次。每组数据正常输入且输入过程中累加求出总和,接下来从第1个位置到第n-1个位置遍历,如果累加中tot变量等于了数组总和得一半,则剩下的一定就是另一半了,这也是为什么遍历到n-1位置的原因,至少保留一个作为平衡的另一半,最后每组数据对应一个输出(Yes/No)配合换行格式即可。
【参考程序】
#include<bits/stdc++.h>
using namespace std;
int a[10010];
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
int sum=0;
for(int i=1;i<=n;i++){
cin>>a[i];
sum+=a[i];
}
int tot=0,fl=0;
for(int i=1;i<n;i++){
tot+=a[i];
if(tot*2==sum){
fl=1;
break;
}
}
if(fl)cout<<"Yes\n";
else cout<<"No\n";
}
}
2、回文拼接
【问题描述】
一个字符串是回文串,当且仅当该字符串从前往后读和从后往前读是一样的,例如,aabaa和ceddcc都是回文串,但abcd不是。
小杨有n个仅包含小写字母的字符串,他想请你编写程序判断每个字符串是否由两个长度至少为2的回文串前后拼接而成。
【输入描述】
第一行包含一个正整数n,代表字符串数量。
之后n行每行一个仅包含小写字母的字符串。
【输出描述】
对于每个字符串输出一行,如果该字符串由两个长度至少为2的回文串前后拼接而成则输出Yes,否则输出No。
【样例输入】
4
Abcd
Aabbb
Aaac
abcdd
【样例输出】
No
Yes
No
No
【题目大意】
【考纲知识点】
【解题思路】
首先需要清楚回文格式这样一个小概念,题面描述要求是整个字符串是否为连个回文格式的子串拼接而成的,所以可以使用循环从中间切开,分成前后很多组尝试,检测前后两个字串是否都是回文格式,题目是多组输入数据,所以循环n次,每次一个输入是,对应一个输出(Yes/No)。由于题目要求长度至少为2,所以对于每个string s,测量长度后从2开始循环到m-2位置,这样变量j刚好用于strsub函数中的位置和长度,求得两个字串s1和s2后使用两个关于k的循环分别反向拼接形成两个反向的串t1和t2,如果t1==s1 && t2==s2证明前后两个字符串都是回文格式的,标记fl = 1,根据fl的状态分支判断,输出答案即可。
【参考程序】
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,k;
cin>>n;
for(int i=1;i<=n;i++){
string s;
cin>>s;
int m = s.length();
int fl = 0;
for(int j=2;j<=m-2;j++){
string s1=s.substr(0,j);
string s2=s.substr(j,m-j);
string t1="",t2="";
for(int k=(int)s1.size()-1;k>=0;k--)t1+=s1[k];
for(int k=(int)s2.size()-1;k>=0;k--)t2+=s2[k];
if(t1==s1&&t2==s2){
fl=1;
break;
}
}
if(fl)cout<<"Yes\n";
else cout<<"No\n";
}
}