1

GESP认证C++编程真题解析 | 202403 三级

​欢迎大家订阅我的专栏:算法题解:C++与Python实现
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!

专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。

适合人群:

  • 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
  • 希望系统学习C++/Python编程的初学者
  • 想要提升算法与编程能力的编程爱好者

附上汇总帖:GESP认证C++编程真题解析 | 汇总


编程题

B3956 字母求和

【题目来源】

洛谷:B3956 [GESP202403 三级] 字母求和 - 洛谷

【题目描述】

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

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

【输入】

第一行一个正整数 \(n\),表示字符串中字母的个数。
第二行一个由大写字母和小写字母的字符串 T,代表加密后得到的字符串。

【输出】

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

【输入样例】

3
aAc

【输出样例】

-61

【算法标签】

《洛谷 B3956 字母求和》 #字符串(入门)# #GESP# #2024#

【代码详解】

#include <bits/stdc++.h>  // 包含所有标准库头文件
using namespace std;      // 使用标准命名空间

int n;         // 定义一个整数n(虽然代码中未使用)
string t;      // 定义一个字符串t用于存储输入

int main() {
    cin >> n >> t;  // 输入整数n和字符串t(注意n在后续代码中未被使用)
    int sum = 0;    // 初始化求和变量为0
    
    // 遍历字符串中的每个字符
    for (int i = 0; i < t.size(); i++) {
        if (t[i] >= 'a' && t[i] <= 'z') {  // 如果是小写字母
            // 计算字母在字母表中的位置(a=1,b=2,...)并累加
            sum += (t[i] - 'a' + 1);
        }
        else if (t[i] >= 'A' && t[i] <= 'Z') {  // 如果是大写字母
            // 取字母ASCII码的负值并累加
            sum += -1 * t[i];
        }
    }
    
    cout << sum << endl;  // 输出最终计算结果
    return 0;            // 程序正常结束
}

【运行结果】

3
aAc
-61

B3957 完全平方数

【题目来源】

洛谷:B3957 [GESP202403 三级] 完全平方数 - 洛谷

【题目描述】

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

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

【输入】

第一行一个非负整数 \(n\),表示非负整数个数。
第二入行包含 \(n\) 个非负整数 \(A_1,A_2,…A_n\),表示序列 \(A\) 包含的非负整数。

【输出】

输出一行一个整数表示答案。

【输入样例】

5
1 4 3 3 5

【输出样例】

3

【算法标签】

《洛谷 B3957 完全平方数》 #数组# #GESP# #2024#

【代码详解】

#include <bits/stdc++.h>  // 包含所有标准库头文件
using namespace std;      // 使用标准命名空间

const int N = 1005;  // 定义数组最大长度
int n, cnt;          // n: 数字个数,cnt: 计数器
int a[N];            // 存储数字的数组

int main() {
    cin >> n;  // 输入数字个数n
    
    // 读取n个数字存入数组a
    for (int i = 1; i <= n; i++) 
        cin >> a[i];

    // 双重循环遍历所有数字对
    for (int i = 1; i <= n; i++) {         // 外层循环,第一个数字
        for (int j = i + 1; j <= n; j++) { // 内层循环,第二个数字(保证i<j)
            int t = a[i] + a[j];           // 计算两数之和
            int sq = sqrt(t);              // 计算和的平方根
            
            // 检查是否为完全平方数
            if (sq * sq == t) 
                cnt++;  // 如果是完全平方数,计数器加1
        }
    }
    
    cout << cnt << endl;  // 输出满足条件的数字对数量
    return 0;            // 程序正常结束
}

【运行结果】

5
1 4 3 3 5
3
posted @ 2026-01-19 16:50  热爱编程的通信人  阅读(0)  评论(0)    收藏  举报