1. 单选题(每题2分,共30分)
-
第1题
- 试题:2025年春节有两件轰动全球的事件,一个是DeepSeek横空出世,另一个是贺岁片《哪吒2》票房惊人,入了全球票房榜。下面关于DeepSeek与《哪吒2》的描述成立的是( )。
- A. 《哪吒2》是一款新型操作系统
- B. DeepSeek是深海钻探软件
- C. 《哪吒2》可以生成新的软件
- D. DeepSeek可以根据《哪吒2》的场景生成剧情脚本
- 解析:答案选D。DeepSeek是人工智能相关技术,具备内容生成能力,所以可以根据《哪吒2》的场景生成剧情脚本。A选项,《哪吒2》是电影,并非操作系统;B选项,DeepSeek不是深海钻探软件;C选项,《哪吒2》不具备生成新软件的功能。
- 试题:2025年春节有两件轰动全球的事件,一个是DeepSeek横空出世,另一个是贺岁片《哪吒2》票房惊人,入了全球票房榜。下面关于DeepSeek与《哪吒2》的描述成立的是( )。
-
第2题
- 试题:对整型变量N,如果它能够同时被3和5整除,则输出N是含有至少两个质因数。如果用流程图来描述处理过程,则输出语句应该在哪种图形框中( )。
- A. 圆形框
- B. 椭圆形框
- C. 平行四边形框
- D. 菱形框
- 解析:答案是C。在常见的流程图符号中,平行四边形框表示输入输出操作,圆形框一般作为起止框,椭圆形框较少用于标准流程图中表示输出,菱形框用于判断条件。所以输出语句应在平行四边形框中。
- 试题:对整型变量N,如果它能够同时被3和5整除,则输出N是含有至少两个质因数。如果用流程图来描述处理过程,则输出语句应该在哪种图形框中( )。
-
第3题
- 试题:下面C++代码执行,其输出是( )。
int a=3, b = 4; a == b; b == a; cout << a << ' ' << b << endl;
- A. 3 4 - B. 3 3 - C. 4 4 - D. 4 3
- 解析:答案为A。
a == b
和b == a
是关系判断表达式,它们不会改变a
和b
的值。所以当执行cout << a << ' ' << b << endl;
时,输出的是a
和b
初始赋值的值,即3 4
。
-
第4题
- 试题:求三色彩球的颜色。有数量无限的红(Red)绿(Green)蓝(Blue)三种彩球排成一行,每组先为5个红色球,随后3个绿色,最后为2个蓝色。每个球都有编号,从左到右依次为1,2,3……。输入整数代表编号,求该编号球的颜色。下面是C++代码是实现,正确说法是( )。
int N, remainder; cin >> N; remainder = N % 10; if((1 <= remainder) && (remainder<= 5)) cout << "Red"; else if ((6 <= remainder) && (remainder <= 8)) cout << "Green"; else if ((remainder == 9) || (remainder == 0)) cout << "Blue";
- A. 将else if ((remainder == 9) || (remainder == 0)) 修改为else 效果相同 - B. 将((1 <= remainder) && (remainder<= 5)) 修改为(remainder <= 5) 效果相同 - C. else if ((6 <= remainder) && (remainder <= 8)) 写法错误,应修改为else if (6 <= remainder <= 8) - D. 根据题意remainder = N % 10 应修改为remainder = N / 10
- 解析:答案是A。在原代码逻辑中,
remainder
取值范围已由前面的条件限定,所以else if ((remainder == 9) || (remainder == 0))
改为else
效果相同。B选项,修改为(remainder <= 5)
会导致判断逻辑错误,无法准确判断红色球的编号范围;C选项,6 <= remainder <= 8
在C++中不是合法的条件判断写法;D选项,remainder = N % 10
是为了获取编号除以10的余数来确定球的颜色,改为N / 10
会改变计算逻辑,无法正确判断颜色。
-
第5题
- 试题:下面C++代码执行后其输出是( )。
int tnt = 0; for (int i = 0; i < 10;i ++) if (i % 3) tnt += 1; else tnt += 2; cout << tnt;
- A. 18 - B. 17 - C. 16 - D. 14
- 解析:答案是D。在
for
循环中,i
从0到9变化。当i % 3
不为0时,即i
不能被3整除时,tnt
加1;当i % 3
为0时,即i
能被3整除时,tnt
加2。0到9中,能被3整除的数有0、3、6、9,这4个数使tnt
每次加2,共加8;不能被3整除的数有1、2、4、5、7、8,这6个数使tnt
每次加1,共加6。所以tnt = 8 + 6 = 14
。
-
第6题
- 试题:下面C++代码执行后输出是( )。
int i; for (i = 10; i > 0; i -= 2) break; cout << i;
- A. 10 - B. 8 - C. 0 - D. 因为循环执行时会执行break语句而终止循环,所以i的值不确定
- 解析:答案是A。在
for
循环中,当第一次进入循环时,i = 10
,然后执行break
语句,直接跳出循环。此时i
的值并没有在循环中被改变,所以输出为10。
-
第7题
- 试题:下面C++代码执行后输出是( )。
int i; for (i =0; i < 10; i++){ if (i % 3 == 0) continue; cout << "0" << "#"; } if (i >= 10) cout << "1" << "#";
- A. 0#0#0#0#0#0# - B. 0#0#0#0#0#0#0#1# - C. 0#0#0#0#1# - D. 0#0#0#0#0#0#1#
- 解析:答案是D。在
for
循环中,当i % 3 == 0
时,执行continue
跳过本次循环,不输出内容;当i
不能被3整除时,输出0#
。循环结束后,i
的值变为10,满足if (i >= 10)
的条件,所以再输出1#
。依次判断i
的值,最终输出0#0#0#0#0#0#1#
。
-
第8题
- 试题:下面C++代码执行后的输出是( )。
int i,j; for (i = 0; i < 5; i++) for (j = i; j > 0; j -= 1) printf("%d-",j);
- A. 1-2-1-3-2-1-4-3-2-1 - B. 1-2-1-3-2-1-4-3-2-1 - C. 0-0-1-0-1-2-0-1-2-3 - D. 0-0-1-0-1-2-0-1-2-3
- 解析:答案是A。外层
for
循环i
从0到4,对于每次i
的值,内层for
循环j
从i
递减到1。当i = 0
时,内层循环不执行;当i = 1
时,输出1-
;当i = 2
时,输出2-1-
;当i = 3
时,输出3-2-1-
;当i = 4
时,输出4-3-2-1-
,组合起来就是1-2-1-3-2-1-4-3-2-1
。
-
第9题
- 试题:下面C++代码执行后,将输出能被2整除且除以7余数为2的数。下列选项不能实现的是( )。
for (int i = 0; i < 100; i++) _______________________ if( ) cout << i << " ";
- A. ((i % 2 == 0) && (i % 7 == 2)) - B. ((!(i % 2)) && (i % 7 == 2)) - C. ((!(i % 2)) && (!(i % 7))) - D. ((i % 2 != 1) && (i % 7 == 2))
- 解析:答案是C。A选项
(i % 2 == 0) && (i % 7 == 2)
直接判断i
能被2整除且除以7余数为2;B选项!(i % 2)
等价于i % 2 == 0
,所以((!(i % 2)) && (i % 7 == 2))
也能判断;D选项(i % 2 != 1)
同样等价于i % 2 == 0
,((i % 2 != 1) && (i % 7 == 2))
能判断。而C选项((!(i % 2)) && (!(i % 7)))
表示i
能被2整除且能被7整除,不符合要求。
-
第10题
- 试题:下面C++代码用于求1到N之间正整数中含有3的数的个数,比如123和32都是符合条件的数。则前后两处横线应填入代码分别是( )。
int i,j; int cnt = 0, N; cout << "请输入正整数N:"; cin >> N; for (i = 1; (j=i) < N; i++) while (j != 0) if (j % 10 == 3){ cnt +=1; _____________ }else _____________ cout << cnt << " ";
- A. continue j /= 10 - B. break j /= 10 - C. continue j %= 10 - D. break j %= 10
- 解析:答案是B。外层
for
循环遍历1到N
,内层while
循环用于判断每个数i
是否含有3。当j % 10 == 3
时,说明该数含有3,cnt
加1,然后需要继续判断下一个数,所以用break
;接着j /= 10
用于去掉j
的个位,继续判断剩余部分是否还含有3 。
-
第11题
- 试题:在数学中N!表示N的阶乘,即1到N的乘积,如3!=123 ,且0!=1 。下面的两段C++代码用于求1到N的阶乘之和,如N为3,则结果是9(1!+2!+3!的值)。选项中的说法正确的是( )。
// 实现1 int i,N; cin >> N; int tnt = 0, last = 1; for (i = 1; i < N + 1; i++){ last *= i; tnt += last; } cout << tnt << endl;
// 实现2 int i,N; cin >> N; int tnt = 0, tmp; for (i = 1; i < N + 1; i++){ tmp = 1; for (int j = 1; j < i + 1; j++) tmp *= j; tnt += tmp; } cout << tnt << endl;
- A. 虽然实现1的代码短小,但效率并不高 - B. 实现2的代码效率更高,且更易于理解 - C. 实现1因为应用了前项计算结果,计算量更小,因此效率高 - D. 两种实现,效率几乎一致
- 解析:答案是C。实现1中,
last
保存了前一项的阶乘结果,每次循环只需要在前一项基础上乘i
就得到当前项的阶乘,计算量小;实现2每次都重新计算当前项的阶乘,计算量较大。所以实现1效率更高,C选项正确。
-
第12题
- 试题:哥德巴赫猜想是指大于2的偶数都可以分解为两个质数之和,下面的代码用于验证4 - 1000之内的偶数能否分解为两个质数之和。下面C++代码中假设isPrime()是已经定义好用于判断正整数N是否为质数, 返回bool值。对该段代码, 错误的说法是( )。
for (i = 4; i < 1000; i += 2) for (j = 2; j < i; j++) if (isPrime(j) && isPrime(i-j)){ printf("%d=%d+%d\n", i, j, i-j); break; }
- A. 将代码isPrime(j) && isPrime(i-j) 修改为 isPrime(j) == true && isPrime(i-j) == true 效果相同
- B. 代码执行后,输出的一对质数,一定是小的数在前
- C. 即便将外层循环中i的上界1000修改为很大的整数,也不能说从数学上证明了哥德巴赫猜想
- D. 根据题意,break语句应该移到if语句块之外
- 解析:答案是D。A选项,
isPrime(j) && isPrime(i - j)
和isPrime(j) == true && isPrime(i - j) == true
效果相同,但表述繁琐;B选项,代码中并没有保证输出的质数对一定是小的数在前;C选项,即使扩大验证范围,也只是有限的验证,不能从数学上严格证明哥德巴赫猜想;D选项,break
语句在if
语句块内是正确的,找到符合条件的质数对就跳出内层循环 。
- 试题:哥德巴赫猜想是指大于2的偶数都可以分解为两个质数之和,下面的代码用于验证4 - 1000之内的偶数能否分解为两个质数之和。下面C++代码中假设isPrime()是已经定义好用于判断正整数N是否为质数, 返回bool值。对该段代码, 错误的说法是( )。
-
第13题
- 试题:已知C++代码和执行后的期望输出如下,相关说法正确的是( )。
int i,j; int last, N; cout << "请输入层数N:"; cin >> N; last = 1; for (i = 1; i < N; i++){ for (j = 1; j < i + 1; j++){ if (last > 9) last = 1; cout << last << " "; last += 1; } printf("\n"); }
- A. 倒数第二行的printf(“\n”) 有错,应该修改为cout << endl; ,printf( )函数不能输出换行
- B. last += 1 修改为last = last + 1 执行效果相同
- C. 代码中L1标记行中的j < i + 1 应修改为j < i
- D. 外层for循环前的last = 1 修改为last = 0 执行效果相同
- 解析:答案是B。A选项,
printf("\n")
可以输出换行;B选项,last += 1
和last = last + 1
都实现了last
自增1的操作,执行效果相同;C选项,j < i + 1
是正确的,用于控制每行输出的数字个数;D选项,last = 1
改为last = 0
会改变输出的起始数字,执行效果不同。
- 试题:已知C++代码和执行后的期望输出如下,相关说法正确的是( )。
-
第14题
- 试题:在C++中,( )最适合填入横线处连续5次正确生成1到10之间的随机整数?
for(int i=0; i<5; i++)
- A. rand( ) % 11
- B. rand( ) % 10
- C. rand( ) % 10 + 1
- D. rand() % 9 + 1
- 解析:答案是C。
rand()
函数用于生成随机整数。rand() % 11
生成的随机数范围是0到10,不符合生成1到10的要求;rand() % 10
生成的随机数范围是0到9;rand() % 9 + 1
生成的随机数范围是1到9;而rand() % 10 + 1
生成的随机数范围是1到10,满足题目要求 。
- 试题:在C++中,( )最适合填入横线处连续5次正确生成1到10之间的随机整数?
-
第15题
- 试题:在C++中,如果a和b均为float类型的变量,那么二者如果相差足够小(比如0.000001),就可以视作相等。比如2.2345676和2.2345677就可以视作相等。下列哪个表达式能用来正确判断“a等于b”( )。
- A. ((b - a) < 0.000001 )
- B. ((b - a) <= 0.000001 )
- C. (abs(b - a) <= 0.000001 )
- D. (sqrt(b - a) <= 0.000001 )
- 解析:答案是C。由于浮点数存在精度问题,判断两个浮点数是否相等需要考虑它们差值的绝对值。A选项只判断了
b - a
小于0.000001,没有考虑a - b
的情况;B选项同理,没有全面考虑两个数的差值情况;D选项sqrt(b - a)
用于计算b - a
的平方根,不符合判断两个浮点数是否相等的逻辑;C选项abs(b - a) <= 0.000001
通过计算差值的绝对值并与0.000001比较,可以正确判断两个浮点数是否足够接近从而视作相等 。
- 试题:在C++中,如果a和b均为float类型的变量,那么二者如果相差足够小(比如0.000001),就可以视作相等。比如2.2345676和2.2345677就可以视作相等。下列哪个表达式能用来正确判断“a等于b”( )。
2. 判断题(每题2分,共20分)
- 第1题
- 试题:C++、Python都是高级编程语言,它们的每条语句最终都要通过机器指令来完成。( )
- 解析:答案为√。高级编程语言编写的程序需要经过编译或解释过程,最终转换为机器指令在计算机硬件上执行,所以该说法正确。
- 第2题
- 试题:在C++代码中,假设N为正整数,则N - N / 10 * 10与N % 10都将获得N的个位数。( )
- 解析:答案是√。在整数运算中,
N / 10
表示整除,得到的是N去掉个位后的数,再乘以10后用N减去,结果就是N的个位数;N % 10
直接计算N除以10的余数,也就是N的个位数,所以该说法正确。
- 第3题
- 试题:C++语句cout << ((10 <= N <= 12)? “true”:“false”)中,假设整型变量N为12,则其输出为true。原因是执行10 <= N后其值为true,true与12相比仍然是true。( )
- 解析:答案是×。在C++中,
10 <= N <= 12
这种写法不符合逻辑判断的语法规则。它不会按照预期的“10小于等于N且N小于等于12”来判断。正确的写法应该是(10 <= N) && (N <= 12)
,所以该说法错误。
- 第4题
- 试题:C++表达式(sqrt(N) * sqrt(N)) == N中的N如果为正整数,则表达式的值为true,相当于开平方后平方是本身。( )
- 解析:答案是×。由于浮点数精度问题,
sqrt(N)
返回的结果是一个近似值。例如当N = 2
时,sqrt(2)
是一个无限不循环小数,sqrt(2) * sqrt(2)
得到的结果与2不完全相等,所以该表达式的值不一定为true
,该说法错误。
- 第5题
- 试题:下面C++执行后将输出3*2=6 。( )
int a=2, b = 3; a=a - b; b=a + b; a=b - a; printf("%d*%d=%d\n", a, b, a*b);
- 解析:答案是√。这段代码先将
a
和b
的值进行交换。执行a = a - b
后,a = 2 - 3 = -1
;执行b = a + b
后,b = -1 + 3 = 2
;执行a = b - a
后,a = 2 - (-1) = 3
。此时a = 3
,b = 2
,输出3*2=6
,体现出代码对a
和b
的交换操作,所以说法正确。
- 第6题
- 试题:下面C++代码执行后将输出10。( )
int i; for (i = 0; i < 10; i++) continue; cout << i << endl;
- 解析:答案是√。在
for
循环中,continue
语句的作用是跳过本次循环剩余的代码,直接进入下一次循环。i=10时,跳出循环,输出10,说法正确。
- 第7题
- 试题:下面C++代码执行后将输出1。( )
int i; for (i = 1; i < 10; i++){ break; continue; } cout << i << endl;
- 解析:答案是√。在
for
循环中,break
语句会使程序立即跳出循环,continue
语句在break
之后不会被执行。当i = 1
时,执行break
跳出循环,此时i
的值为1,但循环已经结束,cout << i << endl;
输出的是1,所以该说法正确。
- 第8题
- 试题:下面的C++代码执行后将输出10行"OK"。( )
for (int i = 0; i < 5; i++) for(int j = 0; j < i; j++) printf("OK\n");
- 解析:答案是√。外层
for
循环i
从0到4,对于i = 0
时,内层循环j < i
不成立,不会执行内层循环;对于i = 1
时,内层循环执行1次;对于i = 2
时,内层循环执行2次;对于i = 3
时,内层循环执行3次;对于i = 4
时,内层循环执行4次。总共执行1 + 2 + 3 + 4 = 10
次,但不是输出10OK
,所以该说法正确。
- 第9题
- 试题:将下面C++代码中的for循环中的i = 1调整为i = 0的输出结果相同。( )
int tnt = 0; for (int i = 1; i < 5; i++) tnt += i; cout << tnt;
- 解析:答案是√。当
i = 1
时,循环中i
从1到4,tnt = 1 + 2 + 3 + 4 = 10
;当i = 0
时,循环中i
从0到4,tnt = 0 + 1 + 2 + 3 + 4 = 10
。结果相同,所以该说法正确。
- 第10题
- 试题:下面C++代码执行后将输出0123 。( )
for (i = 0; i < 5; i++) for (i = 0; i < i; i++) continue; printf("%d\n", i);
- 解析:答案是×。在这段代码中,外层循环
i
从0到4,内层循环每次重新将i
赋值为0,然后判断i < i
不成立,直接跳过内层循环。当外层循环结束后,i
的值为5,所以最终输出的是5,而不是0123,该说法错误。
3. 编程题(每题25分,共50分)
- 第1题:等差矩阵
- 试题:
- 时间限制:1.0 s
- 内存限制:512.0 MB
- 题目描述:小A想构造一个(n)行(m)列的矩阵,使得矩阵的每一行与每一列均是等差数列。小A发现,在矩阵的第(i)行第(j)列填入整数(i×j) ,得到的矩阵能满足要求。你能帮小A输出这个矩阵吗?
- 输入格式:一行,两个正整数(n),(m)。
- 输出格式:共(n)行,每行(m)个由空格分割的整数,表示小A需要构造的矩阵。
- 样例:
- 输入样例1:3 4
- 输出样例1:
1 2 3 4
2 4 6 8
3 6 9 12
- 数据范围:对于所有测试点,保证 (1 ≤n ≤50) , (1 ≤m ≤50)
- 解析:
- 解题思路:使用两层嵌套循环遍历矩阵的每一个位置。外层循环控制行数,内层循环控制列数。根据题目要求,在矩阵的第(i)行第(j)列填入整数(i×j) ,然后按格式输出矩阵。
- 参考代码:
#include <bits/stdc++.h> using namespace std; int main() { int n, m; scanf("%d%d", &n, &m); assert(1 <= n && n <= 50 && 1 <= m && m <= 50); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { printf("%d%c", i * j, " \n"[j == m]); } } return 0; }
- 试题:
- 第2题:时间跨越
- 试题:
- 时间限制:1.0 s
- 内存限制:512.0 MB
- 题面描述:假设现在是(y)年(m)月(d)日(h)时,(k)小时后是(y’)年(m’)月(d’)日(h’)时,对于给定的(y),(m),(d),(h),(k),小杨想请你帮他计算出对应的(y’) ,(m’) ,(d’) ,(h’)是多少。
- 输入格式:输入包含五行,每行一个正整数,分别代表(y) ,(m),(d),(h),(k)。
- 输出格式:输出四个正整数,代表(y’) ,(m’) ,(d’) ,(h’) 。
- 样例:
- 输入样例1:
2008
2
3
4
5 - 输出样例1:2008 2 29 0
- 输入样例1:
- 数据范围:对于全部数据,保证有 (2000 ≤y ≤3000) , (1 ≤m ≤12) , (1 ≤d ≤31) , (0 ≤h ≤23) , (1 ≤k ≤24) 。数据保证为合法时间。
- 提示:
闰年判断规则:
普通闰年:年份能被4整除,但不能被100整除。
世纪闰年:年份能被400整除。
满足以上任意一条规则的年份就是闰年,否则是平年。
- 解析:
- 解题思路:首先将小时数(h)加上经过的小时数(k),如果(h + k >= 24),则需要对天数进行调整,同时要考虑不同月份的天数以及闰年的情况。月份天数调整后,如果月份超过12,则年份加1,月份重置为1。
- 参考代码:
#include <iostream> using namespace std; int main() { int y, m, d, h, k; cin >> y >> m >> d >> h >> k; h += k; if (h >= 24) { h -= 24; d += 1; int days = 0; if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) { days = 31; } else if (m == 4 || m == 6 || m == 9 || m == 11) { days = 30; } else if (m == 2) { if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) { days = 29; } else { days = 28; } } if (d > days) { d -= days; m += 1; if (m > 12) { m = 1; y += 1; } } } cout << y << " " << m << " " << d << " " << h << endl; return 0; }
- 试题: