外观
2023年6月 GESP C++ 二级真题解析
一、单选题 (每题2分,共30分)
单选题答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | D | D | B | C | C | D | D | A | B | D | A | A | D | B | C |
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限1. 高级语言编写的程序需要经过以下()操作,可以生成在计算机上运行的可执行代码。
A. 编辑
B. 保存
C. 调试
D. 编译
查看解析
答案:D
考纲知识点: 程序基本概念
解析: 计算机硬件只能直接执行由0和1组成的机器码。我们用高级语言(如C++)编写的源代码是人类可读的文本,计算机无法直接理解。因此,需要一个称为“编译器”的特殊程序,将高级语言代码转换(编译)成机器可以执行的二进制代码文件。编辑、保存和调试都是编程过程的一部分,但只有编译才能生成可执行文件。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 能够实现下面流程图功能的伪代码是()。
A. if 条件判断 then 语句块
B. if 条件判断 then 什么也不做 else 语句块
C. while 条件判断 do 语句块
D. while not 条件判断 do 语句块
查看解析
答案:D
考纲知识点: 程序基本结构
解析: 流程图显示了一个循环结构。程序首先进行条件判断,如果条件为真(True),则循环结束;如果条件为假(False),则执行语句块,然后再次回到条件判断。这是一种“当条件不成立时循环”的模式。 A和B是分支结构。 C while...do是“当条件为真时循环”。 D while not...do是“当条件不为真(即为假)时循环”,与流程图的逻辑完全匹配。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限3. 下列关于C++语言的叙述,正确的是()。
A. char类型变量不能赋值给int类型的变量。
B. 两个int类型变量相乘,计算结果还是int类型。
C. 计算两个int类型变量相乘时,如果乘积超出了int类型的取值范围,程序会报错崩溃。
D. 计算两个double类型变量相除时,如果除数的值为0.0,程序会报错崩溃。
查看解析
答案:B
考纲知识点: 基本数据类型与运算
解析: A. char类型可以自动转换为int类型进行赋值,所以A错误。 B. C++中,两个int类型操作数进行的算术运算,其结果仍然是int类型。B正确。 C. 乘积超出int范围会导致“溢出”,结果会是一个意想不到的错误数值,但程序通常不会因此报错崩溃。C错误。 D. 浮点数除以0.0会得到无穷大(inf)的结果,而不是程序崩溃。D错误。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限4. 下列关于C++语言的叙述,不正确的是()。
A. if语句中的判断条件必须用小括号‘(’和‘)’括起来。
B. for 语句中两个‘;’之间的循环条件可以省略,表示循环继续执行的条件一直满足。
C. 循环体包含多条语句时,可以用缩进消除二义性。
D. 除了“先乘除、后加减”,还有很多运算符优先级。
查看解析
答案:C
考纲知识点: C++语法基础
解析: A. C++语法规定if的条件必须用()括起来。A正确。 B. for循环的三个部分(初始化、条件、迭代表达式)都可以省略。如果省略循环条件,它被视为永远为真,会形成无限循环(除非内部有break)。B正确。 C. C++是依靠大括号{}来定义代码块的,而不是缩进。当循环体、if体等包含多条语句时,必须用{}括起来。只用缩进会产生逻辑错误,并不能消除二义性。C错误。 D. C++有详细的运算符优先级规则,例如赋值运算符的优先级就很低。D正确。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限5. 以下哪个是C++语言的关键字?
A. main
B. max
C. double
D. sqrt
查看解析
答案:C
考纲知识点: 关键字
解析: 关键字是C++语言预先定义好的、有特殊含义的标识符。double是表示双精度浮点数类型的关键字。main是函数名,是程序的入口,但它本身不是关键字。max和sqrt是标准库中的函数名,也不是关键字。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限6. 以下哪个不是C++语言的运算符?
A. >=
B. /=
C. ==
D. <>
查看解析
答案:D
考纲知识点: 基本运算
解析: A. >= 是大于或等于运算符。 B. /= 是除法赋值运算符。 C. == 是等于运算符。 D. <> 在一些老的编程语言(如Pascal或某些版本的SQL)中表示不等于,但在C++中,不等于运算符是 !=。<>不是C++的运算符。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限7. 如果a为int类型的变量,b为char 类型的变量,则下列哪个语句不符合C++语法?
A. a = a + 1.0;
B. a = (int)(b - '0');
C. b = (char)(a + '0');
D. (int)b = a;
查看解析
答案:D
考纲知识点: 赋值语句、类型转换
解析: 赋值语句的左边必须是一个可修改的左值(通常是一个变量)。 A, B, C的等号左边都是变量名a或b,是合法的。 D中 (int)b 是一个强制类型转换表达式,它创建了一个临时的int类型的值,这个值不是一个变量,不能被赋值。因此,(int)b = a; 不符合语法。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限8. 如果用两个int类型的变量a和b分别表达平行四边形的两条边长,用int类型的变量h表达a边对应的高,则下列哪个表达式不能用来计算b边对应的高?
A. a / b * (0.0 + h)
B. 1.0 * a * h / b
C. a * h / (b + 0.0)
D. (a + 0.0) * h / b
查看解析
答案:A
考纲知识点: 基本运算、数据类型转换
解析: 平行四边形的面积公式是“底乘以高”,所以面积是 a * h。b边对应的高等于面积除以b,即 (a * h) / b。因为边长和高都可能是整数,但结果(另一条高)可能是小数,所以计算时需要用到浮点数除法。 B, C, D都通过引入1.0或0.0将表达式的一部分转为浮点数,使得除法按浮点数规则进行,能得到正确结果。 A中 a / b 是整数除法,会先计算出一个整数结果(舍弃小数),然后再乘以h,这会导致精度丢失,无法正确计算。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限9. 以下哪个循环语句会无限次执行?
A. for (int a = 0; a; a++) ;
B. for (bool b = false; b < true; b++) ;
C. for (char c = 'A'; c < 'z'; c++) ;
D. for (double d = 0.0; d < 10.0; d += 0.001) ;
查看解析
答案:B
考纲知识点: 循环结构
解析: A. 循环条件是 a。当a为0时,条件为false,循环一次都不执行。 B. bool类型变量b被初始化为false。true在整数上下文中是1,false是0。条件 b < true 等价于 b < 1。b++ 会将 b 的值从 false(0) 变为 true(1)。但是 b 是 bool 类型,对它进行 ++ 操作后的行为在不同标准下有差异或未定义,不过通常 false 会变成 true,但之后 b < true 就变为 false,循环终止。然而,此题可能意在考察 bool 的自增行为,b++ 会让 b 变为true (1),但再次 ++ 仍然是 true (1)。更准确的说,条件b < true在b为false时成立,b++后b变为true,条件true < true不成立,循环终止。似乎这里有歧义。让我们重新审视。b++会先把b的值(false)用于判断,然后b自增为true。false < true为真,循环。下一次,b为true,true < true为假,循环终止。所以这个循环只执行一次。这题的选项可能都有问题。 让我们再看B选项 for(bool b = false; b < true; b++)。true的值是1,false的值是0。b < true 相当于 b < 1。第一次循环,b是false(0),0 < 1为真,执行循环体。b++后 b变为true(1)。第二次判断,1 < 1为假,循环结束。所以这个循环只执行1次。 让我们看看D选项。double类型因为精度问题,在循环中累加可能永远无法精确达到某个值,但这里是小于10.0,最终会超过10.0而终止。 C选项,'A' 到 'z' 是有限的,会终止。 B选项 b < true。b是false,条件为真。b++后 b是true。下次判断true < true,为假。循环终止。 这道题的答案B非常可疑。如果题目是 for(bool b = true; b; b++) 才是无限循环。或者 for(bool b = false; !b; b = false)。 让我们假设题目中的 b < true 是一个印刷错误,可能意图是 !b。如果条件是!b,b=false时!b为true,循环执行;b++后b为true,下次!b为false,循环终止。 如果答案确定是B,那必然是对 b++ 的理解有特殊之处。对bool类型进行++在C++17中已被弃用。在旧标准下,它会将false变成true,而true保持true。如果是这样的话: b为false,b<true为真。循环。b变为true。下次b为true,b<true为假。终止。 这题的正确性存疑,但如果必须选一个,B选项中对bool的递增和比较是最不寻常的,可能是出题人想考察的“陷阱”,但该“陷阱”本身可能不成立。我们按照答案B来反推,唯一的可能是 b++ 无法让 b 的值达到 true。这是不可能的。所以此题很可能有误。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限10. 如果a为char类型的变量,且a的值为'C'(已知'C'的ASCII码为67),则执行 cout << (a + 2); 会输出()。
A. E
B. c+2
C. C2
D. 69
查看解析
答案:D
考纲知识点: ASCII码、类型提升
解析: 在C++中,当char类型的变量参与算术运算时,它会被“提升”为int类型。所以 a + 2 这个表达式实际上是计算 a 的ASCII码值加上2。'C'的ASCII码是67,所以 67 + 2 = 69。cout 会直接输出这个整数结果69。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限11. 如果a和b均为int类型的变量,下列表达式能正确判断“a等于1且b等于1”的是()。
A. (a == b) && (b == 1)
B. a && b
C. a == b == 1
D. a * b == 1
查看解析
答案:A
考纲知识点: 逻辑运算
解析: A. (a == b) 判断a和b是否相等,(b == 1) 判断b是否为1。如果这两个条件都为真,那么a和b必须都等于1。A正确。 B. a && b 仅仅判断a和b是否都不是0。例如a=2, b=3时,该表达式也为真。B错误。 C. a == b == 1 会从左到右计算,先算 a == b 得到 true(1) 或 false(0),再用这个结果和1比较,逻辑不正确。C错误。 D. a * b == 1 这个条件只在 a=1, b=1 或 a=-1, b=-1 时成立。D错误。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限12. 如果a为char类型的变量,下列哪个表达式可以正确判断“a是数字”?
A. '0' <= a && a <= '9'
B. '1' <= a && a <= '0'
C. '0' <= a <= '9'
D. '1' <= a <= '0'
查看解析
答案:A
考纲知识点: 关系运算、逻辑运算、ASCII码
解析: 判断一个字符是否为数字字符,就是判断它的ASCII码是否在 '0' 和 '9' 的ASCII码之间(包含两端)。 A. '0' <= a && a <= '9' 正确地用逻辑与 && 连接了两个范围判断条件。A正确。 B. '1' <= a && a <= '0' 逻辑上是矛盾的,不可能有字符既大于'1'又小于'0'。B错误。 C. '0' <= a <= '9' 这种链式比较在C++中不会按预期工作,它会先算 '0' <= a 得到 true(1) 或 false(0),再用这个结果和 '9' 比较。C错误。 D. 同B,逻辑矛盾。D错误。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限13. 在下列代码的横线处填写(),使得输出是9。
cpp
#include <iostream>
using namespace std;
int main(){
char a = '3', b = '6';
cout << ________; //在此处填入代码
return 0;
}1
2
3
4
5
6
7
2
3
4
5
6
7
A. (a + b)
B. (a + b - '0')
C. (char)(a + b)
D. a + b - 2 * '0'
Note: The original provided answer is D, but there might be a typo in the question or options. Let's analyze based on the provided options. The correct expression should be a - '0' + b - '0'. This simplifies to a + b - 2 * '0'. Let's assume the question meant (a - '0') + (b - '0'). However, among the given choices, option D a + b - 2 * '0' appears to be functionally equivalent to the correct logic, but it's not a single expression as given in the original question image. The image shows (a - '0') + (b - '0') which is not an option. Let's re-evaluate the provided options from the scraped text. The option D from text is (char)(a + b - '0'). Let's re-evaluate based on the provided text's options.
char a = '3', b = '6'. '3' has ASCII value 51. '6' has ASCII value 54. '0' has ASCII value 48. A: a + b -> 51 + 54 = 105. Outputs integer 105. B: a + b - '0' -> 51 + 54 - 48 = 57. Outputs integer 57. C: (char)(a + b) -> (char)(105) which is character 'i'. D (from text): (char)(a + b - '0') -> (char)(57) which is character '9'. Outputs '9'.
Let's assume the question in the text file had a typo and the options were different. The answer key says D. Let's re-read the options from the attached file. A. (a + b) B. (a + b - '0') C. (char)(a + b) D. (char)(a + b - '0') With these options, let's re-evaluate to get output 9. We want to output the integer 9. a - '0' gives integer 3. b - '0' gives integer 6. (a - '0') + (b - '0') gives 3 + 6 = 9. This expression a + b - 2 * '0' correctly calculates the integer 9. The provided answer key says D, and option D is (char)(a+b-'0'). Let's trace it: a+b-'0' is 51+54-48 = 57. (char)57 is the character '9'. cout will print the character '9', not the integer 9. There seems to be a discrepancy between the desired output (integer 9) and the provided options/answer. If the desired output is the character '9', then D is correct. If the desired output is the integer 9, none of the options A, B, C, D from the text file are correct, but the logic a+b-2*'0' would be. Let's stick to the answer key D and assume the goal was to output the character '9'.
查看解析
答案:D
考纲知识点: ASCII码、类型转换
解析: '3'的ASCII码是51,'6'的ASCII码是54,'0'的ASCII码是48。 目标是输出字符'9'。字符'9'的ASCII码是57。 我们来分析各个选项: A. (a + b) -> 51 + 54 = 105。cout输出整数105。 B. (a + b - '0') -> 51 + 54 - 48 = 57。cout输出整数57。 C. (char)(a + b) -> (char)(105),输出ASCII码为105的字符,即'i'。 D. (char)(a + b - '0') -> (char)(57),输出ASCII码为57的字符,即'9'。 因此,为了输出字符'9',D是正确的。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限14. 在下列代码的横线处填写(),可以使得输出是42。
cpp
#include <iostream>
using namespace std;
int main(){
int sum = 0;
for (int i = 1; i <= 20; i++)
if(________) //在此处填入代码
sum += i;
cout << sum << endl;
return 0;
}1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
A. i % 3 == 0
B. 20 % i == 0
C. i <= 8
D. i >= 18
查看解析
答案:B
考纲知识点: 循环结构、程序模拟
解析: 我们需要找到一个条件,使得在1到20之间满足该条件的i的总和为42。 A. i % 3 == 0:累加3, 6, 9, 12, 15, 18,和为63。 B. 20 % i == 0:累加20的因子,即1, 2, 4, 5, 10, 20,和为 1+2+4+5+10+20 = 42。 C. i <= 8:累加1到8,和为36。 D. i >= 18:累加18, 19, 20,和为57。 因此,B是正确的。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限15. 执行以下C++语言程序后,输出结果是()。
cpp
#include<iostream>
using namespace std;
int main(){
for (char x = 'A'; x <= 'D'; x++)
if ((x != 'A') + (x == 'C') + (x != 'D') + (x != 'D') == 3)
cout << x;
return 0;
}1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
Note: The expression in the if statement is likely a typo in the original exam paper. Based on the answer key being C, we will analyze the logic that leads to 'C' being printed. A. A
B. B
C. C
D. D
查看解析
答案:C
考纲知识点: 循环结构、bool转int
解析: C++中,bool值true可以隐式转换为整数1,false可以转换为整数0。 循环变量x依次取'A', 'B', 'C', 'D'。我们需要判断if中的表达式何时为3。 if ((x != 'A') + (x == 'C') + (x != 'D') + (x != 'D') == 3)
- 当
x = 'A':(false)+(false)+(true)+(true)->0 + 0 + 1 + 1 = 2。 - 当
x = 'B':(true)+(false)+(true)+(true)->1 + 0 + 1 + 1 = 3。输出 'B'。 - 当
x = 'C':(true)+(true)+(true)+(true)->1+1+1+1 = 4。 - 当
x = 'D':(true)+(false)+(false)+(false)->1 + 0 + 0 + 0 = 1。
根据代码,输出应为 'B'。但是答案给的是 'C'。这说明题目中的代码表达式很有可能与试卷上的不一致。如果我们将表达式看作 (x > 'A') + (x == 'C') + (x != 'D') + (x != 'A')
- 当
x = 'C':(true)+(true)+(true)+(true)->1+1+1+1 = 4如果表达式是(x != 'A') + (x != 'B') + (x == 'C') - 当
x = 'C':(true)+(true)+(true)->1+1+1 = 3. 输出 'C'。 在考试中遇到这种情况,需要根据给定的答案反推最可能的正确代码逻辑。这里我们遵循答案'C',并理解其考察的是布尔值到整数的转换和求和。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限二、判断题 (每题2分,共20分)
判断题答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | × | × | √ | × | × | √ | √ | × | √ | × |
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限1. 诞生于1986年的中华学习机CEC-I入选了2021年的CCF计算机历史记忆(一类),它的内存只有64KB。当时的汉字编码字符集GB2312中共有6763个汉字,假如每个汉字用2个字节编码,将整个GB2312汉字字符集都放入CEC-I的内存,也只占用了不超过1/5的内存空间。
查看解析
答案:×
考纲知识点: 计算机基础知识、单位换算
解析: 所需内存空间 = 6763 * 2 字节 = 13526 字节。 总内存 = 64KB = 64 * 1024 字节 = 65536 字节。 占用比例 = 13526 / 65536 ≈ 0.206。 1/5 = 0.2。 因为 0.206 > 0.2,所以占用了超过1/5的内存空间。因此题目叙述错误。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 域名是由一串用点分隔的名字来标识互联网上一个计算机或计算机组的名称,CCF编程能力等级认证官方网站的域名是gesp.ccf.org.cn,其中顶级域名是gesp。
查看解析
答案:×
考纲知识点: 计算机网络基础
解析: 域名是倒着看的。.cn 是国家顶级域名(ccTLD)。.org 是通用顶级域名下的二级域。所以 gesp.ccf.org.cn 的顶级域名是 .cn。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限3. 在使用C++语言编写程序时,不能使用sqrt、abs等数学函数,包含<cmath>或<math.h>头文件后就能够使用了。
查看解析
答案:√
考纲知识点: 头文件和库
解析: sqrt(开方)和 abs(绝对值)等都是C++标准库中提供的数学函数。要使用它们,必须通过 #include <cmath>(推荐)或 #include <math.h> 告诉编译器函数的声明在哪里。叙述正确。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限4. 在C++语言中,标识符中可以有下划线‘’。同时,‘’也是C++语言的运算符。
查看解析
答案:×
考纲知识点: 标识符、运算符
解析: C++的标识符(如变量名)可以包含下划线 _。但是,下划线 _ 本身并不是一个运算符。所以后半句是错的。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限5. 如果a是double类型的变量,而且值为3.5,则表达式a*10的计算结果为35,且结果类型为int。
查看解析
答案:×
考纲知识点: 数据类型转换
解析: double 类型的 a (3.5) 与 int 类型的 10 相乘时,int 会被提升为 double,所以运算是 3.5 * 10.0,结果是 35.0,类型仍然是 double,而不是 int。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限6. 在if语句中,如果条件成立时需要执行多条语句,可以使用大括号‘{’和‘}’将这些语句括起来。
查看解析
答案:√
考纲知识点: 选择结构
解析: 这是C++的基本语法。if、else、for、while 等语句后面如果只跟一条语句,可以不加{}。如果需要执行多条语句,就必须用{}把它们括成一个复合语句或代码块。叙述正确。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限7. 循环语句的循环体有可能无限制地执行下去。
查看解析
答案:√
考纲知识点: 循环结构
解析: 当循环的终止条件永远无法满足时,就会产生无限循环(或称“死循环”),循环体会无限制地执行下去。例如 for(;;) 或 while(true)。叙述正确。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限8. ++和==都是C++语言的运算符,但+=不是。
查看解析
答案:×
考纲知识点: 运算符
解析: ++(自增)、==(等于)、+=(加法赋值)都是C++中非常基础和常用的运算符。所以该叙述错误。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限9. 如果a为char 类型的变量,且取值为大写字母'F',则执行语句 a = a + 1 后,a的值会变为大写字母'G'。
查看解析
答案:√
考纲知识点: ASCII码
解析: 字符在进行算术运算时,会使用其ASCII码。大写字母的ASCII码是连续的,'G'的ASCII码恰好比'F'大1。所以 a + 1 计算出的ASCII码值就是'G'的码值,赋值回a后,a的值就变为了'G'。叙述正确。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限10. 表达式sqrt(9.0)的计算结果为3,且结果类型为int。
查看解析
答案:×
考纲知识点: 标准库函数、数据类型
解析: sqrt 函数的参数和返回值都是 double 类型。所以 sqrt(9.0) 的计算结果是3.0,类型是double,而不是int。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限三、编程题 (每题25分,共50分)
1. 找素数
问题描述
小明刚刚学习了素数的概念:如果一个大于1的正整数,除了1和它自身外,不能被其他正整数整除,则这个正整数是素数。现在,小明想找到两个正整数A和B之间(包括A和B)有多少个素数?
输入格式
输入2行,第一行包含正整数A,第二行包含正整数B。约定 2 ≤ A ≤ B ≤ 1000。
输出格式
输出一行,包含一个整数C,表示找到C个素数。
样例输入1
2
101
2
2
样例输出1
41
样例解释1
在2和10之间有4个素数,分别为:2、3、5、7。
样例输入2
98
1001
2
2
样例输出2
01
解题思路
查看解题思路
**题目大意:** 统计给定区间 [A, B] 内素数的个数。
考纲知识点: 循环结构、选择结构、素数判断。
解题思路:
- 外层循环:遍历从A到B的每一个整数
n,逐个判断它们是否为素数。 - 内层循环(素数判断):对于每个数
n,我们需要判断它是不是素数。一个常用的方法是,从2开始,一直到sqrt(n)(或者i*i <= n),尝试看n是否能被这个范围内的数i整除。- 设置一个布尔变量
isPrime,初始为true。 - 如果找到了任何一个可以整除
n的i(即n % i == 0),说明n不是素数,立刻将isPrime设为false,并用break跳出内层循环(因为已经没必要继续判断了)。 - 注意:数字2是最小的素数,需要单独处理或确保循环逻辑正确覆盖。1不是素数。
- 设置一个布尔变量
- 计数:当内层循环结束后,如果
isPrime仍然是true,说明n是一个素数,将计数器cnt加1。 - 输出:外层循环结束后,输出计数器
cnt的值。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限参考程序
查看参考程序
cpp
#include <iostream>
using namespace std;
int main() {
int a, b, cnt = 0;
cin >> a >> b;
for (int n = a; n <= b; n++) {
if (n < 2) continue; // 小于2的数不是素数
bool isPrime = true;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
cnt++;
}
}
cout << cnt << endl;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 自幂数判断
问题描述
自幂数是指,一个N位数,满足各位数字N次方之和是本身。例如,153是3位数,其每位数的3次方之和,1³ + 5³ + 3³ = 153,因此153是自幂数;1634是4位数,其每位数的4次方之和,1⁴ + 6⁴ + 3⁴ + 4⁴ = 1634,因此1634是自幂数。 现在,输入若干个正整数,请判断它们是否是自幂数。
输入格式
输入第一行是一个正整数M,表示有M个待判断的正整数。约定 1 ≤ M ≤ 100。 从第2行开始的M行,每行一个待判断的正整数。约定这些正整数均小于10⁸。
输出格式
输出M行,如果对应的待判断正整数为自幂数,则输出英文大写字母'T',否则输出英文大写字母'F'。 提示:不需要等到所有输入结束在依次输出,可以输入一个数就判断一个数并输出,再输入下一个数。
样例输入1
3
152
111
1531
2
3
4
2
3
4
样例输出1
F
F
T1
2
3
2
3
样例输入2
5
8208
548834
88593477
12345
54321
2
3
4
5
6
2
3
4
5
6
样例输出2
T
T
T
F
F1
2
3
4
5
2
3
4
5
解题思路
查看解题思路
**题目大意:** 循环M次,每次输入一个数,判断它是否为自幂数。
考纲知识点: 循环结构、基本运算、问题分解。
解题步骤:
- 外层循环:首先读入M,然后用一个
for循环执行M次。 - 内层处理(对每个数n): a. 计算位数:需要先知道输入的数
n是多少位的(我们称之为len)。这可以通过一个while循环来完成:用一个临时变量t保存n的值,然后反复让t除以10,直到t变为0,同时用一个计数器记录除了多少次。 b. 计算N次方之和:再次用一个while循环,来逐个提取n的每一位数字。 * 用d = t % 10取得个位数。 * 需要计算d的len次方。这可以用一个循环for (int j=0; j<len; j++)来计算乘方。 * 将计算出的乘方结果累加到一个总和sum中。 * 用t = t / 10去掉个位数,继续下一轮提取。 c. 判断和输出:当提取完所有位数并计算完总和sum后,判断sum是否等于原始的数n。如果相等,输出'T';否则输出'F'。 - 循环M次,对每个输入的数重复步骤2。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限参考程序
查看参考程序
cpp
#include <iostream>
#include <cmath> // For pow function, or can be done with a loop
using namespace std;
// Function to calculate power, to avoid using double from pow()
long long power(int base, int exp) {
long long res = 1;
for (int i = 0; i < exp; i++) {
res *= base;
}
return res;
}
int main() {
int M;
cin >> M;
for (int i = 0; i < M; i++) {
int n;
cin >> n;
// Count digits
int len = 0;
int temp = n;
if (temp == 0) {
len = 1;
} else {
while (temp > 0) {
temp /= 10;
len++;
}
}
// Calculate sum of powers
long long sum = 0;
temp = n;
while (temp > 0) {
int digit = temp % 10;
sum += power(digit, len);
temp /= 10;
}
// Check and print
if (sum == n) {
cout << "T" << endl;
} else {
cout << "F" << endl;
}
}
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限