ARTICLE · 1331507
GESP 三级真题|字母求和|详细解析 + 完整代码
2024 年 GESP C++ 三级编程真题精讲 · ASCII 判断 · 字符遍历 · 累加求和
哈喽各位同学,今天给大家带来一道 2024 年 GESP C++ 三级编程真题:字母求和。
这道题考察字符 ASCII 码判断、字符遍历、累加求和,是三级非常经典的字符处理入门题,难度不大,但是很容易踩坑。
01 题目回顾
题目名称:字母求和
小杨发明了一种密码规则:
字符类型代表的值
小写字母字母表位置:a=1,b=2 … z=26
大写字母ASCII 码的相反数:A 的 ASCII 是 65,所以 A = −65,B = −66,以此类推
给定一个只包含大小写字母的字符串,把每个字母对应的值加起来,输出总和。
样例说明
输入 3 aAc
输出 −61
a = 1,A = −65,c = 3,1 − 65 + 3 = −61
输入输出说明
第一行一个整数 n,表示字符串字母个数
第二行字符串 s,只含大小写英文字母
输出所有字母对应数字相加后的总和
小提示
题目给的 n 可以读进来,本题实际写代码的时候也可以不用它,直接遍历字符串就行。
02 解题思路
(1) 定义总和变量 sum,初始值为 0
(2) 循环遍历字符串里的每一个字符 ch
(3)判断字符:小写字母用 ch - 'a' + 1 累加;大写字母用 -(int)ch 累加
(4)遍历结束,输出 sum
重点坑点提醒
很多同学会误以为大写字母也按字母序号取负数(比如以为 A = −1),这是本题最大的陷阱。
题目明确写的是:大写字母代表它 ASCII 码 的相反数,不是序号相反数。A → −65,不是 −1。一定要看清楚题面,凭经验做题很容易整段写错。
03 C++ 完整参考代码
下面这版是范围 for 写法,GESP 考场可直接提交。
C++ · 范围 for 版本
#include <iostream>
#include <string>
using namespace std;
int main()
{
int n;
string s;
cin >> n >> s;
int sum = 0;
for (char ch : s)
{
if (ch >= 'a' && ch <= 'z')
{
// 小写:字母位置 a=1
sum += ch - 'a' + 1;
}
else if (ch >= 'A' && ch <= 'Z')
{
// 大写:ASCII 取反
sum += -(int)ch;
}
}
cout << sum << endl;
return 0;
}
如果还不会范围 for,用下标循环也完全可以,两版逻辑一致。
C++ · 下标循环版本
#include <iostream>
#include <string>
using namespace std;
int main()
{
int n;
string s;
cin >> n >> s;
int sum = 0;
for (int i = 0; i < s.size(); i++)
{
char ch = s[i];
if (ch >= 'a' && ch <= 'z')
{
sum += ch - 'a' + 1;
}
else
{
sum += -(int)ch;
}
}
cout << sum << endl;
return 0;
}
第二版直接 else 兜底,是因为字符串只含字母,非小写即大写,逻辑上安全;如果想更严谨,也可以保留 else if。
04 测试样例
输入
3 aAc
运行结果
-61
验算:1 +(−65)+ 3 = −61 ✔
05 考点总结
字符的 ASCII 码理解GESP 三级核心考点,大小写字母的区分判断用区间判断。
仔细读题,审题是 GESP 拿分的关键。
这道题的区分点就在大写字母的规则上。很多同学凭经验做题,直接写成 -(ch - 'A' + 1),一交卷就全错。
06 课后小练习
自己试一组:
输入:
2
Bb
B 的 ASCII 是 66,对应 −66;b 是 2;总和应该是 −64。用上面任意一版代码跑一下,看看结果对不对。
想练手的话,还可以把规则反过来改一改:大写字母按字母序号取负数,小写字母按 ASCII 码取相反数,自己写一版,对照着看看两套规则差在哪。
今天这道 GESP 三级字符题,你学会了吗?
后续持续更新 GESP 真题解析、易错点、全套代码,喜欢可以点赞 + 关注。有不会的题目欢迎留言,看到都会回。
点赞 · 在看 · 转发给正在学习的同学















































































