image

编辑人: 人逝花落空

calendar2025-06-15

message8

visits462

2024年3月CCF-GESP编程能力等级认证C++编程三级真题答案及解析

一、单选题

1、整数-5的16位补码表示是(   )。

A 1005

B 1006

C FFFA

D FFFB

解析:【喵呜刷题小喵解析】:

首先,我们需要了解补码的概念。补码是计算机中表示负整数的方法。对于16位补码,最高位(符号位)是1表示负数,0表示正数。

对于整数-5,首先将其转换为二进制形式:
-5 = -101b

为了得到-5的16位补码表示,我们需要:
1. 将-5转换为16位的二进制形式,但保持最高位为1(表示负数)。
2. 翻转其余位(即取反)。
3. 在最低位加1。

-5的16位二进制表示为:1111 1111 1111 0101b
翻转得到:0000 0000 0000 1010b
加1得到:0000 0000 0000 1011b

所以,-5的16位补码表示为:0000 0000 0000 1011b,这等于十六进制的0xFFFB。

在选项中,最接近这个值的是FFFB。因此,正确答案是D。

2、如果16位短整数 -2 的二进制是"FFFE",则短整数 -4 的十六进制是(   )。

A FF04

B FFFA

C FFFC

D FFFH

解析:【喵呜刷题小喵解析】

首先,我们需要理解题目中的信息。题目给出了16位短整数-2的二进制表示是"FFFE",并问短整数-4的十六进制表示是什么。

要找到-4的十六进制表示,我们需要首先找到-4的二进制表示。因为计算机中的数值都是基于二进制的,所以我们需要知道-4在二进制中是如何表示的。

我们知道,在二进制中,-4可以表示为1111 1111 1111 1100。这是因为,在16位二进制中,最高位(符号位)是1表示负数,接下来的15位是1111 1111 1111 1100,这表示4的二进制补码。

然后,我们需要将这个二进制数转换为十六进制。转换的方法是,每4位二进制数对应一个十六进制数。所以,1111 1111 1111 1100可以转换为FFFC。

但是,题目要求的是短整数的十六进制表示,短整数通常只有16位。所以,我们需要去掉最左边的位,只剩下15位。这15位是1111 1111 1111 0000,这对应的十六进制是FFF0。

但是,题目要求的是-4的十六进制表示,而不是FFF0。我们需要对FFF0取反加1,得到FF04。这是因为,在计算机中,负数的表示是其正数的补码取反加1。

所以,短整数-4的十六进制表示是FF04。因此,正确答案是A选项。

3、下面C++代码执行后的输出是(   )。

int main()
{
	cout << (3|16) << endl;
	cout << endl;
	return 0;
}

A 3

B 16

C 19

D 48

解析:【喵呜刷题小喵解析】:在C++中,位运算符`|`表示按位或运算。对于整数3和16,其二进制表示分别为0011和00010000。按位或运算的规则是,对于每一位,如果任一操作数为1,则结果为1,否则为0。因此,3|16的二进制结果为00110000,即十进制数19。所以,代码执行后的输出是19。

4、定义整数 int x=-5 ,则执行C++代码 cout << (x == (x<<1>>1)) 输出是(   )。

A 0

B 1

C -5

D 5

解析:【喵呜刷题小喵解析】

首先,我们分析题目中的C++代码:


```cpp
cout << (x == (x<<1>>1))
```
1. 假设`int x = -5`,我们先看表达式`(x << 1 >> 1)`。这里涉及到位运算。`<<`是左移运算符,`>>`是右移运算符。


* `x << 1`:将x向左移动1位,相当于乘以2。`-5`的二进制表示是`11111011`(忽略符号位),左移1位后变为`11111110`,即-10。
* `-10 >> 1`:将-10向右移动1位,相当于除以2。`-10`的二进制表示是`11111110`(忽略符号位),右移1位后变为`1111111`,即-5。
2. 接着,我们看表达式`x == (x<<1>>1)`。由于`(x<<1>>1)`的结果是-5,所以整个表达式变为`x == -5`。

因为`x`的值是-5,所以`x == -5`的结果为`true`,输出结果为1。

因此,答案是B。

5、已知字符 '0' 的ASCII编码的十进制表示为48,则执行下面C++代码后,输出是(   )

int main()
{
	string s="316";
	int n=s.length();
	int x=0;
	for(int i = 0; i < n; i++)
		x += s[i];
	cout << x << endl;
	cout << endl;
	return 0;
}

A 10

B 58

C 154

D 316

解析:【喵呜刷题小喵解析】:根据ASCII编码,字符'0'的十进制表示为48,字符'1'的十进制表示为49,字符'6'的十进制表示为54。根据代码,`s`的字符依次与0相加,即48+49+54=151,但代码中的`x`初始化为0,所以最终`x`的值为151+0=151,而不是154。因此,输出应为151,选项C错误。实际上,代码中的`x`并没有在输出中使用,所以输出应为空行。所以,此题可能存在错误,正确答案无法从选项中选出。如果忽略输出部分,只考虑`x`的值,那么正确答案应为151。

6、下面C++代码执行后数组中大于0的数的特征是(   )。

int main()
{
	int a[20],i;
	for(i = 0; i < 20; i++)
		a[i] = i+1;
	for(int i = 0; i < 20; i++)
		if((a[i]%2)&&(a[i]%3))
			a[i] = 0;
	for(i = 0; i < 20; i++)
		if(a[i])
			cout << a[i] << " ";
	cout << endl;
	return 0;
}

A 2的倍数

B 3的倍数

C 能被2或3整除的数

D 能被2和3同时整除的数

解析:【喵呜刷题小喵解析】:根据代码,数组a[20]中的每个元素被初始化为i+1,其中i从0到19。然后,代码遍历数组,对于每个元素,如果它既是2的倍数又是3的倍数(即a[i]%2和a[i]%3都不为0),则将其设置为0。最后,代码输出数组中所有非零元素。由于数组中的每个元素最初都是i+1,所以非零元素必须是既能被2整除又能被3整除的数。因此,答案是D,即能被2和3同时整除的数。

7、执行下面C++代码后输出的第一个数是(   )。

int main()
{
	int a[20],i;
	for(i = 0; i < 20; i++)
		a[i] = i+1;
	for( ; i > 0; i--)
		cout << a[i-1] << " ";
	cout << endl;
	return 0;
}

A 20

B 19

C 1

D 不确定

解析:【喵呜刷题小喵解析】:该C++代码定义了一个长度为20的整数数组a,然后用for循环给数组中的每个元素赋值为其下标加1。接着,使用for循环从数组末尾开始向前遍历,输出每个元素的值,并在每个值后输出一个空格。由于数组是从0开始索引的,所以最后一个元素的下标是19,其值为20。第一个for循环结束后,变量i的值为20,满足第二个for循环的条件,因此程序会输出数组最后一个元素的值20,所以输出的第一个数是1。因此,选项C是正确的。

8、在下列代码的横线处填写(   ),可以使得输出是 GESP IS INTERESTING 。

int main()
{
	string str="gEsP is Interesting";
	int x = str.length();
	for(int i = 0; i < x; i++)
		if ((str[i]>='a') && (str[i]<='z'))
			________________________;
	cout << str << endl;
	cout << endl;
	return 0;
}

A str[i]+='a'-'A'

B str[i]+=20

C str[i]+='A'-'a'

D 无法实现

解析:【喵呜刷题小喵解析】:

首先,我们需要理解题目的要求。题目要求我们在给定的代码段中填写适当的代码,使得输出是 "GESP IS INTERESTING"。

给定的代码段中,首先定义了一个字符串 `str`,值为 "gEsP is Interesting"。然后,计算该字符串的长度,并遍历每个字符。

在遍历过程中,代码检查每个字符是否是小写字母。如果是,那么需要将其转换为大写字母。

现在,我们来看选项:

A. `str[i]+='a'-'A'`:这个选项实际上是将小写字母转换为大写字母。但是,这个表达式没有直接应用于字符,而是将字符的ASCII值进行了转换。这在C++中是不合法的,因为字符和整数不能直接相加。

B. `str[i]+=20`:这个选项将字符的ASCII值增加了20,这会导致字符变为完全不同的字符,而不是转换为大写字母。

C. `str[i]+='A'-'a'`:这个选项实际上是将大写字母转换为小写字母,而不是将小写字母转换为大写字母。

D. "无法实现":这是正确的选项。在C++中,字符不能直接进行数学运算,尤其是加法运算。因此,我们无法直接通过加法将小写字母转换为大写字母。

所以,正确的答案是 "无法实现",即选项D。

9、假设英文句子由若干词构成。下面C++代码统计输出的词数是(   )。

int main()
{
	string str="gEsP is Interesting !";
	int x = str.length();
	int nwords = 0;
	for(int i = 0; i < x; i++)
		if (str[i]==' '){
			nwords++;
			while(str[++i]==' ') ;
		}
	cout << nwords << endl;
	cout << endl;
	return 0;
}

A 1

B 2

C 3

D 4

解析:【喵呜刷题小喵解析】:在C++代码中,首先定义了一个字符串`str`,然后计算了字符串的长度`x`。接着,使用for循环遍历字符串中的每个字符。当遇到空格字符时,`nwords`增加1,并使用while循环跳过连续的空格。最后,输出`nwords`的值。对于字符串`"gEsP is Interesting !"`,有3个空格,所以`nwords`的值是3。因此,正确答案是C。

10、C++的字符变量的码值是整数,下面字面量形式的字符码值最大的是(   )。

A 100

B 075

C 0x70

D 0x60

解析:【喵呜刷题小喵解析】:在C++中,字符变量的码值是以整数形式存储的。在选项A、B、C、D中,它们都是字面量形式的字符码值,但是它们的大小取决于它们的十进制值。选项A的值为100,选项B的值为075(在C++中,以0开头的数字是八进制数,所以075等于十进制的75),选项C的值为0x70(以0x开头的数字是十六进制数,所以0x70等于十进制的112),选项D的值为0x60(等于十进制的96)。因此,选项C的十进制值最大,所以选项C的字面量形式的字符码值最大。

11、下面C++程序执行的结果是(   )。

int main()
{
	int a[20],i;
	int cnt=0;
	for(i = 0; i < 20; i++)
		a[i] = i+1;
	for( ; i > 1; i--)
		if((a[i-1]+a[i-2])%3)
			cnt++;
	cout << cnt << endl;
	cout << endl;
	return 0;
}

A 5

B 6

C 10

D 12

解析:【喵呜刷题小喵解析】:

首先,我们分析C++程序。

该程序首先定义了一个整型数组`a`,长度为20,以及一个整型变量`cnt`,初始值为0。

然后,程序通过一个for循环将数组`a`的每个元素设置为其索引加1的值。

接着,程序进入第二个for循环,该循环从`i=19`开始,每次递减1,直到`i=2`。在循环中,程序检查`a[i-1] + a[i-2]`的和是否能被3整除。如果不能被3整除,`cnt`就加1。

最后,程序输出`cnt`的值。

根据数组`a`的定义和初始化,我们可以得到以下数组元素:

a[0] = 1, a[1] = 2, a[2] = 3, a[3] = 4, a[4] = 5, a[5] = 6, a[6] = 7, a[7] = 8, a[8] = 9, a[9] = 10, a[10] = 11, a[11] = 12, a[12] = 13, a[13] = 14, a[14] = 15, a[15] = 16, a[16] = 17, a[17] = 18, a[18] = 19, a[19] = 20

当`i=19`时,`a[i-1] + a[i-2] = a[18] + a[17] = 18 + 17 = 35`,不能被3整除,所以`cnt`加1。

当`i=18`时,`a[i-1] + a[i-2] = a[17] + a[16] = 17 + 16 = 33`,不能被3整除,所以`cnt`加1。

当`i=17`时,`a[i-1] + a[i-2] = a[16] + a[15] = 16 + 15 = 31`,不能被3整除,所以`cnt`加1。

当`i=16`时,`a[i-1] + a[i-2] = a[15] + a[14] = 15 + 14 = 29`,不能被3整除,所以`cnt`加1。

当`i=15`时,`a[i-1] + a[i-2] = a[14] + a[13] = 14 + 13 = 27`,不能被3整除,所以`cnt`加1。

当`i=14`时,`a[i-1] + a[i-2] = a[13] + a[12] = 13 + 12 = 25`,不能被3整除,所以`cnt`加1。

当`i=13`时,`a[i-1] + a[i-2] = a[12] + a[11] = 12 + 11 = 23`,不能被3整除,所以`cnt`加1。

当`i=12`时,`a[i-1] + a[i-2] = a[11] + a[10] = 11 + 10 = 21`,能被3整除,所以`cnt`不加。

当`i=11`时,`a[i-1] + a[i-2] = a[10] + a[9] = 10 + 9 = 19`,不能被3整除,所以`cnt`加1。

当`i=10`时,`a[i-1] + a[i-2] = a[9] + a[8] = 9 + 8 = 17`,不能被3整除,所以`cnt`加1。

当`i=9`时,`a[i-1] + a[i-2] = a[8] + a[7] = 8 + 7 = 15`,不能被3整除,所以`cnt`加1。

当`i=8`时,`a[i-1] + a[i-2] = a[7] + a[6] = 7 + 6 = 13`,不能被3整除,所以`cnt`加1。

当`i=7`时,`a[i-1] + a[i-2] = a[6] + a[5] = 6 + 5 = 11`,不能被3整除,所以`cnt`加1。

当`i=6`时,`a[i-1] + a[i-2] = a[5] + a[4] = 5 + 4 = 9`,不能被3整除,所以`cnt`加1。

当`i=5`时,`a[i-1] + a[i-2] = a[4] + a[3] = 4 + 3 = 7`,不能被3整除,所以`cnt`加1。

当`i=4`时,`a[i-1] + a[i-2] = a[3] + a[2] = 3 + 2 = 5`,不能被3整除,所以`cnt`加1。

当`i=3`时,`a[i-1] + a[i-2] = a[2] + a[1] = 2 + 1 = 3`,不能被3整除,所以`cnt`加1。

当`i=2`时,`a[i-1] + a[i-2] = a[1] + a[0] = 1 + 0 = 1`,不能被3整除,所以`cnt`加1。

当`i=1`时,循环结束。

所以,`cnt`的值为6。

12、定义字符数组 char str[20] = {'G', 'E', 'S', 'P'}; ,则 str 的字符串长度为(   )。

A 4

B 5

C 19

D 20

解析:【喵呜刷题小喵解析】:在C语言中,字符数组是以'\0'字符结尾的,这个字符表示字符串的结束。在题目中,字符数组str定义为char str[20] = {'G', 'E', 'S', 'P'};,这个数组只包含了4个字符,并没有'\0'字符。因此,str的字符串长度是4,而不是数组的大小20。所以,正确答案是A选项,即4。

13、定义整型变量 int a=3, b=16 ,则 a|b 的值和 a+b 的关系是(   )。

A 大于

B 等于

C 小于

D 等于或小于

解析:【喵呜刷题小喵解析】在整型运算中,a|b表示按位或运算,而a+b表示加法运算。对于整型变量int a=3, b=16,a的二进制表示为0011,b的二进制表示为10000。执行按位或运算a|b的结果为10011,转换为十进制为19。而执行加法运算a+b的结果为21。比较19和21,明显19小于21或者等于21,所以a|b的值和a+b的关系是等于或小于。因此,正确答案是D,等于或小于。

14、小杨的父母最近刚刚给他买了一块华为手表,他说手表上跑的是鸿蒙,这个鸿蒙是(    )。

A 小程序

B 计时器

C 操作系统

D 神话人物

解析:【喵呜刷题小喵解析】:根据题目描述,小杨的父母给他买了一块华为手表,手表上跑的是鸿蒙。因此,我们需要确定“鸿蒙”是什么。根据常识和华为的产品线,华为手表通常运行的是其自家的操作系统。因此,选项C“操作系统”是最符合题目描述的答案。其他选项如小程序、计时器和神话人物与题目描述不符。

15、中国计算机学会(CCF)在2024年1月27日的颁奖典礼上颁布了王选奖,王选先生的重大贡献是(    )。

A 制造自动驾驶汽车

B 创立培训学校

C 发明汉字激光照排系统

D 成立方正公司

解析:【喵呜刷题小喵解析】:王选先生是中国计算机学会的重要人物,他在计算机领域做出了重大贡献。根据题目中的选项,我们需要找到与王选先生相关的重大贡献。制造自动驾驶汽车、创立培训学校、成立方正公司都不是王选先生的主要贡献。而发明汉字激光照排系统是与王选先生相关的重大贡献,因此选项C是正确的。

二、判断题

16、任意整数 a 的二进制反码与补码都有1位不同。 (   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:在二进制表示中,一个整数的反码和补码与其原码的关系如下:

1. 原码:直接将整数转换为二进制形式,即符号位为0或1(正数为0,负数为1),其余位为绝对值的二进制表示。
2. 反码:正数的反码与原码相同,负数的反码是在原码的基础上,除符号位外,其余位取反(0变为1,1变为0)。
3. 补码:正数的补码与原码相同,负数的补码是反码加1。

从上面的定义可以看出,只有当整数为-1时,其原码、反码和补码才只有1位不同(即符号位)。对于其他整数,原码、反码和补码至少有2位不同(符号位+至少1位有效位不同)。因此,题目中的说法“任意整数a的二进制反码与补码都有1位不同”是错误的。

17、对整型变量 int a = 3 ,执行C++代码 a<<2 将把2输出到 a 中。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:在C++中,左移操作符`<<`用于将整数的二进制表示向左移动指定的位数。对于整型变量`int a = 3`,其二进制表示为`0011`。执行`a << 2`后,`a`的二进制表示变为`0110`,即十进制中的6。因此,`a`的值变为6,而不是2。所以,题目的说法是错误的。

18、下面C++代码可以计算1到100的累加和,采用的是穷举法。(   )

int main()
{
	int i,sum=0;
	for(int i = 1; i <= 100 ; i++)
		sum += i;
	cout << sum << endl;
	cout << endl;
	return 0;
}

A 正确

B 错误

解析:【喵呜刷题小喵解析】:这段代码计算了1到100的累加和,使用了for循环来穷举从1到100的整数,并将它们累加到变量sum中。最后,使用cout语句输出累加结果。因此,该代码是正确的。但是,有一个小错误,cout语句中endl应该是endl(),所以代码应改为cout << sum << endl; 和 cout << endl; 而不是cout << sum << endl 和 cout << endl。但是,这个错误并不会影响代码的逻辑,只是格式问题,所以这段代码的核心逻辑是正确的。因此,答案为A。

19、一个 int 类型变量 a ,执行操作 (a<<2>>2) 后的值一定是 a 。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:该题目考查了位运算的相关知识。根据位运算的性质,对于整数 a,执行操作 (a<<2) 是将 a 左移 2 位,而执行操作 (a>>2) 是将 a 右移 2 位。因此,执行操作 (a<<2)>>2 实际上是将 a 先左移 2 位,然后再右移 2 位,最终的结果相当于 a 没有发生任何变化。但是,题目中的表述是“一定是 a”,这是不准确的,因为执行操作后,a 的值并没有改变,只是中间过程看起来像是先左移再右移。所以,该题目的表述是错误的,答案应选 B。

20、在C++语言中, (010<<1) 执行结果是 100 。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:在C++语言中,`(010 << 1)` 实际上并不等于 100。在C++中,010 是一个八进制数,其值为 8(在十进制中)。左移操作符 `<<` 会将数字左移指定的位数。因此,`(010 << 1)` 等于 8 左移 1 位,结果为 16(在十进制中)。所以,题目的说法是错误的。

21、执行下面C++代码后将输出 2 。(   )

int main()
{
	string str="gEsP is Interesting";
	int x = str.find("s");
	cout << x << endl;
	cout << endl;
	return 0;
}

A 正确

B 错误

解析:【喵呜刷题小喵解析】:在C++代码中,`str.find("s")`函数用于在字符串`str`中查找子字符串"s"的位置。如果找到,则返回子字符串首次出现的位置;否则,返回`string::npos`。在这个例子中,子字符串"s"在字符串`str`中的位置是2(从0开始计数),所以`x`的值应该是2。但是,`cout`语句没有正确输出`x`的值,因为它缺少一个`<<`操作符来插入`x`的值。正确的输出语句应该是`cout << x << endl;`。因此,该代码不会输出2,而是输出空行。所以答案是B错误。

22、在C++语言中,字符数组被定义时,它的大小可以调整。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:在C++语言中,字符数组在定义时其大小是固定的,不能调整。如果你想要一个可以动态调整大小的字符数组,可以使用标准库中的`std::string`类,它提供了动态调整大小的功能。因此,题目中的说法是错误的。

23、对定义的数组 int a[7]={2,0,2,4,3,1,6} ,可以用简单循环就找到其中最小的整数。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:数组是一种常见的数据结构,它可以存储多个相同类型的数据。对于本题中定义的数组 int a[7]={2,0,2,4,3,1,6},我们可以通过简单循环遍历数组中的每一个元素,比较它们的大小,从而找到最小的整数。因此,该题目中的说法是正确的。

24、小杨今年春节回奶奶家了,奶奶家的数字电视要设置 ip 地址并接入到 WIFI 盒子才能收看节目,那这个 WIFI 盒子具有路由器的功能。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:WIFI盒子通常具有路由器的功能,因为它需要连接互联网并允许设备接入网络。设置IP地址和接入WIFI盒子是收看数字电视节目所必需的步骤,因此WIFI盒子确实具有路由器的功能。因此,这个判断是正确的。

25、任何一个 for 循环都可以转化为等价的 while 循环(  )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:在编程中,for循环和while循环都是控制流语句,用于重复执行一段代码。虽然它们在语法和结构上有所不同,但理论上,任何for循环都可以转化为等价的while循环。这是因为for循环通常包含初始化、条件测试和迭代三个步骤,而这些步骤都可以通过while循环来实现。因此,这个题目的陈述是正确的。

三、实操题

26、字母求和

题面描述

小杨同学发明了一种新型密码,对于每一个小写英文字母,该小写字母代表了一个正整数,即该字母在字母顺序中的位置,例如字母 a 代表了正整数 1,字母 b 代表了正整数 2;对于每一个大写英文字母,该大写字母代表了一个负整数,即该字母的 ASCII 码的相反数,例如字母 A 代表了正整数 -65。小杨同学利用这种方式对一个整数进行了加密并得到了一个由大写字母和小写字母组成的字符串,该字符串中每个字母所代表数字的总和即为加密前的整数,例如 aAc 对应的加密前的整数为 1+(-65)+3=-61。

对于给定的字符串,请你计算出它对应的加密前的整数是多少。

输入格式

第一行一个正整数n,表示字符串中字母的个数。

第二行一个由大写字母和小写字母的字符串T,代表加密后得到的字符串。

输出格式

输出一行一个整数,代表加密前的整数。


样例输入

3

aAc

样例输出

-61

对于全部数据,保证有1≤n≤105

参考答案:对于给定的字符串,我们需要按照题目描述的方式计算每个字母所代表的数字,并将它们相加得到加密前的整数。首先,我们需要读取字符串的长度n和字符串T。然后,我们遍历字符串T中的每个字母,根据题目描述的方式计算每个字母所代表的数字,并将它们累加到变量sum中。最后,我们输出变量sum的值,即为加密前的整数。

解析:【喵呜刷题小喵解析】:
根据题目描述,我们可以得出以下思路:

1. 首先,我们需要读取字符串的长度n和字符串T。这可以通过scanf函数实现。
2. 接着,我们需要遍历字符串T中的每个字母,并根据题目描述的方式计算每个字母所代表的数字。我们可以使用一个for循环来遍历字符串T,使用一个if-else语句来判断字母是大写字母还是小写字母,并根据题目描述的方式计算每个字母所代表的数字。
3. 最后,我们需要将每个字母所代表的数字累加到变量sum中,并输出变量sum的值。我们可以使用一个变量sum来保存累加的结果,并在遍历完字符串T后输出变量sum的值。

需要注意的是,题目中保证有1≤n≤10^5,因此我们需要使用快速算法来处理较大的数据规模。在实际编程中,我们可以使用字符串操作函数strlen来获取字符串T的长度,使用循环来遍历字符串T中的每个字母,并使用if-else语句来判断字母是大写字母还是小写字母,并根据题目描述的方式计算每个字母所代表的数字。最后,我们可以使用变量sum来保存累加的结果,并在遍历完字符串T后输出变量sum的值。

根据题目描述,我们可以得出以下代码实现:


```c
#include

int main() {
int n;
char T[100005];
int sum = 0;

scanf("%d", &n);
scanf("%s", T);

for (int i = 0; i < n; i++) {
if (T[i] >= 'a' && T[i] <= 'z') {
sum += T[i] - 'a' + 1;
} else if (T[i] >= 'A' && T[i] <= 'Z') {
sum += -(T[i] - 'A' + 65);
}
}

printf("%d\n", sum);

return 0;
}
```
在上面的代码中,我们首先读取字符串的长度n和字符串T,然后使用一个for循环来遍历字符串T中的每个字母,并使用if-else语句来判断字母是大写字母还是小写字母,并根据题目描述的方式计算每个字母所代表的数字,并将它们累加到变量sum中。最后,我们输出变量sum的值,即为加密前的整数。

27、完全平方数

题面描述

小杨同学有一个包含n个非负整数的序列A,他想要知道其中有多少对下标组合<i,j>(1≤i,j≤n,i<j),使得Ai+Aj是完全平方数。

如果x是完全平方数,则存在非负整数y使得 y×y=x。

输入格式

第一行一个非负整数n,表示非负整数个数。

第二行包含n个非负整数A1,A2,...,An,表示序列A包含的非负整数。

输出格式

输出一个非负整数,表示和是完全平方数的非负整数对数。


样例输入

5
1 4 3 3 5

样例输出

3

对于全部数据,保证有1≤n≤1000,0≤Ai≤105

参考答案:首先,我们需要遍历数组中的每对元素,计算它们的和,并判断其是否为完全平方数。然后,对完全平方数的对数进行计数。具体实现如下:1. 初始化计数器count为0。2. 遍历数组A中的每对元素(i,j),其中i

解析:【喵呜刷题小喵解析】:
这个问题可以通过遍历数组中的每对元素,并判断它们的和是否为完全平方数来解决。对于每个元素对(i,j),其中i
需要注意的是,由于数组A中的元素是非负整数,因此我们可以使用数学公式来判断一个数是否为完全平方数。具体地,我们可以将sum开平方,然后判断开平方后的结果是否为整数。如果是,则说明sum是完全平方数。

另外,由于题目中给出了n和A[i]的范围,我们可以使用哈希表来优化算法。具体地,我们可以将数组A中的元素作为哈希表的键,将每个元素第一次出现时的索引作为值存储在哈希表中。然后,在遍历数组A中的元素对时,我们可以直接通过哈希表来查找另一个元素的索引,从而避免重复计算。这样可以大大提高算法的效率。

喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:2024年3月CCF-GESP编程能力等级认证C++编程三级真题答案及解析

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share