欢迎大家订阅我的专栏:算法题解:C++与Python实现!
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!
专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。
适合人群:
- 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
- 希望系统学习C++/Python编程的初学者
- 想要提升算法与编程能力的编程爱好者
附上汇总帖:GESP认证C++编程真题解析 | 汇总
单选题
第1题
据有关资料,山东大学于1972年研制成功 DJL-1计算机,并于1973年投入运行,其综合性能居当时全国第三位。DJL-1计算机运算控制部分所使用的磁心存储元件由磁心颗粒组成,设计存贮周期为2us(微秒)。那么该磁心存储元件相当于现代计算机的( )。
A.内存
B.磁盘
C.CPU
D.显示器
【答案】:A
【解析】
磁心存储器是一种早期的随机存取存储器(RAM),断电后会丢失数据,设计存取周期为2微秒,具有较快的访问速度,这与内存的特性一致。而磁盘存储则不具备如此高的存取速度,其主要特点是大容量和非易失性,即断电后数据不会丢失。
第2题
IPv4版本的因特网总共有有( )个A类地址网络。
A.65000
B.200万
C.126
D.128
【答案】:C
【解析】
IPv4版本的 A 类地址网络号占1字节(8位),首位必须是0,全0和全1这两种情况被保留有特殊作用(网络地址和广播地址),所以总共用\(2^7-2=126\)个A类地址。
第3题
在C++中,下列不可做变量的是( )。
A.ccf-gesp
B.ccf_gesp
C.ccfGesp
D._ccfGesp
【答案】:A
【解析】
有效的变量名是由大小写字母、数字、下划线组成的任意长度的序列,且第一个字符不能为数字。另外,C++中有一些关键字已被编程语言保留,不能用作变量名。
A选项的因包含非法字符-(连字符)而不符合C++变量命名规则。
第4题
在C++中,与for (int i =1; i<10; i++)效果相同的是( )
A.for (int i = 0; i<10; i++)
B.for (int i = 0; i<11; i++)
C.for (int i = 1; i<10; ++i)
D.for (int i = 0; i<11; ++i)
【答案】:C
【解析】
原始循环:for (int i =1; i<10; i++)循环变量i从1开始,到9结束,循环共执行9次。
A选项从0到9,共执行10次,不等效。
B选项从0到10,共执行11次,7不等效。
C选项从1到9,共执行9次,且前置递增和后置递增对的结果无影响,因此效果相同。
D边选项从0到10,共执行11次,不等效。
因此,正确答案是:C
第5题
在C++中,cout << (5 / 2 + 5 % 3)的输出是( )。
A.1
B.2
C.3
D.4
【答案】:C
【解析】
先进行除法和取模运算:
表达式5/2:求5除以2的商,结果为1(整数除法,舍去小数部分)。
表达式5%3:求5除以3的余数,结果为2。
然后进行加法运算:1+2=3。
因此最终输出为3,故正确答案为C。
第6题
假定变量a和b可能是整型、字符型或浮点型,则下面C++代码执行时先后输入-2和3.14后,其输出不可能是( )。[已知字符'+'、'-'、'=' 的ASCII码值分别是43、45和61]
cin >> a;
cin >> b;
cout << (a+b);
A.1
B.1.14
C.47
D.将触发异常
【答案】:D
【解析】
A选项:a和b都是整型。输入-2后a=-2,输入3.14会被截断为整数部分,即b=3。输出结果为-2+3=1;
B选项:a和b都是浮点型。输入-2后a=-2.0,输入3.14后b=3.14。输出结果为-2.0+3.14=1.14。
C选项:a为字符类型b为整数类型,输入-2后a='-',b=2,在执行加法时a被转换成整数类型值为'-'的ASCII码45,输出结果45+2=47。
D选项:默认情况下,cin 不会抛出异常,而是设置错误状态标志。
第7题
在C++代码中假设N为正整数,则下面代码能获得个位数的是( )。
A.N%10
B.N/10
C. N && 10
D.以上选项均不正确
【答案】:A
【解析】
在十进制满10进1,个位的位权为\(10^0=1\);十位的位权为\(10^1\);百位的位权为\(10^2\);第N位的位权为:\(10^{N-1}\);该数的数值等于每位的的(数值$\times \(位权)之和。对于任意正整数N,我们可以将其分解成如下形式:\)N=k\times 10+r $,其中k是除去个位后的部分,而r则是个位数。所以N%10可以获得个位数。
第8题
下面C++代码执行后的输出是( )。
int i;
for (i=0; i<10; i++) {if (i%2)break;cout << "0#";
}
if (i==10) cout << "1#";
A.0#
B.1#
C.0#0#1
D.没有输出
【答案】:A
【解析】
第一次迭代时,i=0,检查条件i%2,因为0%2=0,条件为假,不执行 break。 执行 cout <<"0#"输出0#。增加i的值
第二次迭代时,i=1,检查条件i%2,因为1%2=1,条件为真,执行 break 路跳出循环。
因为跳出循环,此时i=1,不满足if(i==10)条件,所以不会输出"1#"。
因此,程序在第一次循环中输出 0#后,由于i%2为真而跳出循环,因此最终的输出结果是0#。
第9题
执行下面C++代码并输入1和0,有关说法正确的是( )。
int a,b;
cin >> a >> b;
if (a&&b)cout << ("1");
else if (!(a||b))cout << ("2");
else if (a || b)cout << ("3");
elsecout << ("4");
A.1
B.2
C.3
D.4
【答案】:C
【解析】
用户输入a=1和b=0。
程序首先检查 if(a && b)条件,因为a=1和b=0,所以a&&b为假,不输出"1"。
接下来检查 else if (!(a || b)) 条件,因为a为真,所以a || b为真,取反后为假,不输出"2“。
然后检查 else if (a || b) 条件,因为a为真,所以a || b为真,满足条件,输出"3"。
最后的 else 不会被执行。
第10题
下面C++代码执行后的输出是( )。
int loopCount = 0;
for (int i=1; i<5; i+=2)loopCount += 1;
cout << (loopCount);
A.1
B.2
C.3
D.5
【答案】:B
【解析】
初始化loopCount 为 0。for 循环从i=1开始,条件是i<5,每次迭代i增加2。
第一次迭代:i=1条件满足(1<5)进入循环体,loopCount 加 1,变为1。
第二次迭代:i=3条件满足(3<5),进入循环体,loopCount 再加1,变为2。
第三次迭代:i=5条件不满足(5>=5),退出循环。
最终输出loopCount 的值,即2
第11题
下图是C++程序执行后的输出。为实现其功能,横线处应填入代码是( )。
7
1
2 3
3 4 5
4 5 6 7
5 6 7 8 9
6 7 8 9 10 11
7 8 9 10 11 12 13//////////////////////////////int lineNum;
cin >> lineNum;
for (int i=1; i<lineNum+1; i++) {for (int ______________)cout << j << " ";cout << endl;
}
【答案】:C
【解析】
根据给定的输出格式,每行的数字从当前行号开始,到当前行号乘以2为止。因此内层循环的条件应该是j=i; j<i*2; j++。
第12题
下面C++代码执行后输出逆序数,如输入123则输出321。如输入120则输出21。横线处先后应填入的代码是( )。
int N;
cin >> N;
int rst = 0;
while (N) {__________________;__________________;
}
cout << (rst);
A.rst = rst * 10 + N % 10 N = N / 10
B.rst += N % 10 N = N / 10
C. rst = rst * 10 + N / 10 N = N % 10
D.rst += N / 10 N = N % 10
【答案】:A
【解析】
使用变量 rst 存储结果。每次取出原数最右边的一位数字,并将其加到结果中。将原数字去掉最右边的一位,继续上述过程直到数字为零。
rst=rst * 10 + N % 10:将当前结果向左移动一位并加上新提取的位数字。
N = N / 10:去掉原数字的最右边一位。
第13题
下面的C++代码用于输入学生成绩,并根据人数计算出平均成绩,有关说法错误的是( )。
float Sum = 0; // 保存总成绩
int cnt = 0; // 保存学生人数
while (1) {int score;cin >> socre;if (score < 0)break;cnt += 1;Sum += score;
}
cout << "总学生数: " << cnt << "平均分: " << Sum/cnt;
A.代码 while (1) 写法错误
B.如果输入负数,将结束输入,并正确输出
C.如果输入的学生成绩含有小数,程序将无法正常执行
D.变量 int score 初始值不确定,但不影响程序执行
【答案】:A
【解析】
在C++中,while(1)中1会被转换为true 是一种常见的无限循环写法,没有语法错误。
第14题
以下C++代码判断输入的正整数是否为质数,如果该数字是质数,则输出YES,否则输出NO。质数是指仅能被1和它本身整除的正整数。请在横线上填写代码。( )
int num, i;
cin >> num;
for (i=2; i<num; i++)if (________) {cout << ("NO");break;}
if (i==num)cout << ("YES");
A.num % i
B.num % i ==0
C.num / i
D.num / i ==0
【答案】:B
【解析】
判断一个数是否为质数,即检查从2到num-1是否有任何数能整除num,在循环中使用条件 if (num % i==0)来检查 i 是否为num 的因子。如果存在这样的数,则 num 不是质数。
第15题
一个数如果能被某个数(比如7)整除,或者含有该数,则说该数是某个数的相关数。下面C++代码用于判定输入的数与7是否有关。下列说法错误的是( )。
int N, M;
bool Flag = false;
cin >> N;
M = N;if (M % 7 ==0)Flag = true;while (!Flag && M) {if (M % 10 == 7 {Flag = true;break;}M /= 10;
}if (Flag)cout << N << "与7有关";
elsecout << N << "与7无关";
A. 删除 break 语句不会导致死循环,但有时会导致结果错误
B.删除 M/=10 将可能导致死循环
C.删除 M=N 并将其后代码中的M 变量改为N,并调整输出同样能完成相关功能
D.删除break 语句不会导致死循环,但有时会影响效率
【答案】:A
【解析】
A/D选项:删除break 语句不会导致死循环,只会影响效率。
B选项:正确,没有M/=10,M 永远不会变成0,循环将永远进行下去。
C选项:正确,修改后可以在 while 循环前输出N。
判断题
第16题
小小杨最近开始学习C++编程,老师说C++是一门面向对象的编程语言,也是一门高级语言。( )
A.正确
B.错误
【答案】:A
【解析】
C++是一门支持面向对象的高级语言。
第17题
在C++中,cout << (3, 4, 5) 可以输出3 4 5,且每个输出项之间用空格分开。( )
A.正确
B.错误
【答案】:B
【解析】
C++中,逗号运算符( , )的作用是计算所有表达式并返回最后一个表达式的值。因此,(3, 4, 5)实际上等价于5,最终会输出5。
第18题
C++表达式12 % 10 % 10的值为2。( )
A.正确
B.错误
【答案】:A
【解析】
现运算10%2=2,再运算2%10=2,最终结果是2。
第19题
C++语句 cout << rand() << ' ' << rand(); 的第二个输出值较大。( )
A.正确
B.错误
【答案】:B
【解析】
rand()用于生成伪随机数,无法任何保证两次调用中哪个值更大。
第20题
定义C++的int 类型的变量ch,而且值为'1',则语句可cout << int(ch);的输出为1。( )
A.正确
B.错误
【答案】:B
【解析】
字符'1'的ASCII 1值是49。当将字符'1'转换为整数时,实际上是在获取它的ASCII 编码值,而不是其字面上的数值。因此,int('1')的结果是49,而不是1。
第21题
下面C++代码执行后将输出10。( )
int i;
for (i=0; i<10; i++)continue;
if (i == 10)cout << i;
A.正确
B.错误
【答案】:A
【解析】
i被初始化为0。只要 i<10 为真,循环继续。每次迭代 i 增加1(i++)。continue 语句使得循环体内没有其他操作直接进入下一次迭代,当 i 达到10时,条件 i<10 不再满足,循环终止,此时i 的值是10因此最终输出10。
第22题
下面C++代码能求整数N和M之间所有整数之和,包含N和M。( )
int N, M, Sum;cin >> N >> M;if (N>M) {int tmp = N;N = M, M = tmp;
}for (int i=N; i<M+1; i++)Sum += i;cout << Sum;
A.正确
B.错误
【答案】:B
【解析】
变量 Sum 没有被初始化为0。Sum持有一个无法确定的初始值,从而导致最终的结果无法确定。
第23题
将下面C++代码中的L3标记的代码行调整为for (int i=0; i<5; i++)后输出结果相同。( )
int loopCount = 0;
for (int i=1; i<5; i++) // L3for (int j=0; j<i; j++)loopCount += 1;
cout << loopCount;
A.正确
B.错误
【答案】:A
【解析】
无论是从i=1到i<5还是从i=0到i<5,最终累加到loopCount 的总和都是10。因此,该题的正确答案为“正确“。
第24题
某一系列数据的规律是从第3个数值开始是前两个数之和。下面的代码求第N个数的值,N限定为大于2。( )
int start1; // 第1个数
int start2; // 第2个数
int N; // 求N个数的值
int tmp;
cin >> start1 >> start2 >> N;for (int i=2; i<N; i++) {tmp = start1 + start2;start1 = start2;start2 = tmp;
}
cout << start2;
A.正确
B.错误
【答案】:A
【解析】
每次迭代中,将当前的start1与 start2相加得到tmp。然后更新start1和start2的值,使得start1变为之前的start2, start2 变为新的和 tmp。
这个过程模拟了斐波那契数列的生成方式,从第三个数开始每个数都是前两个数之和。最终输出的是第N个数的值,即start2。
第25题
下面C++代码执行时如果输入2024,则输出是4202。( )
int N, flag=0;
cin >> N;
while (N) {if (!flag) cout << N % 10;N /= 10;flag = (flag+1)%2;
}
A.正确
B.错误
【答案】:B
【解析】
flag 的值在0和1之间交替,如果 flag 为0, 则输出N 的最后一位位数字名(即N%10)。该程序的实际输出是40,而不是题目所述的4202。
编程题
B4036 数位之和
【题目来源】
洛谷:[B4036 GESP202409 二级] 数位之和 - 洛谷
【题目描述】
小杨有\(n\)个正整数,他认为一个正整数是美丽数字当且仅当该正整数每一位数字的总和是\(7\)的倍数。小杨想请你编写一个程序判断\(n\)个正整数哪些是美丽数字。
【输入】
第一行包含一个正整数\(n\),代表正整数数量。
之后\(n\)行,每行包含一个正整数。
【输出】
对于每个正整数,如果是美丽数字则输出Yes,否则输出No。
【输入样例】
3
7
52
103
【输出样例】
Yes
Yes
No
【算法标签】
《洛谷 B4036 数位之和》 #2024# #GESP#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int n, ans; // n: 数字个数, ans: 实际上没有被使用int main()
{cin >> n; // 输入数字个数for (int i = 1; i <= n; i++) // 处理每个数字{int x; // 当前要判断的数字cin >> x; // 读入数字int tot = 0; // 用于存储各位数字之和// 计算数字x的各位数字之和while (x) // 当x不为0时循环{tot += (x % 10); // 取x的个位数加到tot中x /= 10; // 去掉x的个位数}// 判断各位数字之和是否能被7整除if (tot % 7 == 0) cout << "Yes" << endl; // 如果能被7整除else cout << "No" << endl; // 如果不能被7整除}return 0;
}
【运行结果】
3
7
Yes
52
Yes
103
No
B4037 小杨的 N 字矩阵
【题目来源】
洛谷:[B4037 GESP202409 二级] 小杨的 N 字矩阵 - 洛谷
【题目描述】
小杨想要构造一个\(m\times m\) 的\(N\)字矩阵(为奇数),这个矩阵的从左上角到右下角的对角线、第\(1\)列和第\(m\)列都是半角加号+,其余都是半角减号-。例如,一个\(5\times 5\)的\(N\)字矩阵如下:
+---+
++--+
+-+-+
+--++
+---+
请你帮小杨根据给定的打印出对应的\(N\)字矩阵。
【输入】
输入格式第一行包含一个正整数\(m\)。
【输出】
输出对应的\(N\)字矩阵。
【输入样例】
5
【输出样例】
+---+
++--+
+-+-+
+--++
+---+
【算法标签】
《洛谷 B4037 小杨的N字矩阵》 #模拟# #GESP# #2024#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int n; // 矩阵大小 n×nint main()
{cin >> n; // 输入矩阵大小for (int i = 1; i <= n; i++) // 外层循环,控制行{for (int j = 1; j <= n; j++) // 内层循环,控制列{// 判断当前位置应该输出什么字符if (j == 1 || j == n) // 如果是第一列或最后一列{cout << "+";}else // 如果不是第一列或最后一列{if (i == j) // 如果在主对角线上{cout << "+";}else // 其他位置{cout << "-";}}}cout << endl; // 每行结束后换行}return 0;
}
【运行结果】
5
+---+
++--+
+-+-+
+--++
+---+