GESP 四级题单(简单) • 附免费参考答案

2024-05-03 07:44

本文主要是介绍GESP 四级题单(简单) • 附免费参考答案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

GESP 四级题单

  • [GESP样题 四级] 绝对素数
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 参考答案
  • [GESP样题 四级] 填幻方
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 参考答案
  • [GESP202309 四级] 进制转换
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 样例 #2
      • 样例输入 #2
      • 样例输出 #2
    • 提示
    • 参考答案
  • ★[GESP202312 四级] 小杨的字典
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 样例 #2
      • 样例输入 #2
      • 样例输出 #2
    • 样例 #3
      • 样例输入 #3
      • 样例输出 #3
    • 新知
    • 参考答案
    • 代码详解
  • [GESP202403 四级] 相似字符串
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示
    • 参考答案

[GESP样题 四级] 绝对素数

题目描述

如果一个两位数是素数,且它的数字位置经过对换后仍为素数,则称为绝对素数,例如 13 13 13。给定两个正整数 A , B A, B A,B,请求出大于等于 A A A、小于等于 B B B 的所有绝对素数。

输入格式

输入 1 1 1 行,包含两个正整数 A A A B B B。保证 10 < A < B < 100 10<A<B<100 10<A<B<100

输出格式

若干行,每行一个绝对素数,从小到大输出。

样例 #1

样例输入 #1

11 20

样例输出 #1

11
13
17

参考答案

// absolutePrime.cpp
// 素筛、模拟
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;int l, r;bool isPrime(string num)
{int n = stoi(num);for (int i = 2; i * i <= n; i++){if (n % i == 0){return false;}}return true;
}int main()
{cin >> l >> r;for (int i = l; i <= r; i++){string num2 = to_string(i);string num1 = num2;reverse(num2.begin(), num2.end());if (isPrime(num1) && isPrime(num2)){cout << i << endl;}}return 0;
}

[GESP样题 四级] 填幻方

题目描述

在一个 N × N N\times N N×N 的正方形网格中,每个格子分别填上从 1 到 N × N N×N N×N 的正整数,使得正方形中任一行、任一列及对角线的几个数之和都相等,则这种正方形图案就称为“幻方”(输出样例中展示了一个 3 × 3 3×3 3×3 的幻方)。我国古代称为“河图”、“洛书”,又叫“纵横图”。

幻方看似神奇,但当 N N N 为奇数时有很方便的填法:

  1. 一开始正方形中没有填任何数字。首先,在第一行的正中央填上 1 1 1
  2. 从上次填数字的位置向上移动一格,如果已经在第一行,则移到同一列的最后一行;再向右移动一格,如果已经在最右一列,则移动至同一行的第一列。如果移动后的位置没有填数字,则把上次填写的数字的下一个数字填到这个位置。
  3. 如果第 2 步填写失败,则从上次填数字的位置向下移动一格,如果已经在最下一行,则移到同一列的第一行。这个位置一定是空的(这可太神奇了!)。把上次填写的数字的下一个数字填到这个位置。
  4. 重复 2、3 步骤,直到所有格子都被填满,幻方就完成了!

快来编写一个程序,按上述规则,制作一个 N × N N\times N N×N 的幻方吧。

输入格式

输入为一个正奇数 N N N,保证 3 ≤ N ≤ 21 3 \leq N \leq 21 3N21

输出格式

输出 N N N 行,每行 N N N 个空格分隔的正整数,内容为 N × N N×N N×N 的幻方。

样例 #1

样例输入 #1

3

样例输出 #1

8 1 6
3 5 7
4 9 2

参考答案

// magicSquare.cpp
// 数组、模拟
#include <iostream>
using namespace std;int n;
int x, y;
int tx, ty;
int fnum = 1;
int a[25][25];int main()
{// 输入cin >> n;// 第一步x = 1;y = n/2+1;a[x][y] = 1;// 第二步 & 第三步while (fnum < n * n){// 试图完成第二步tx = x;ty = y;tx = ((tx == 1) ? n : tx - 1);ty = ((ty == n) ? 1 : ty + 1);if (a[tx][ty] == 0){a[tx][ty] = ++fnum;x = tx, y = ty;continue;}// 第二步失败,完成第三步tx = x, ty = y;tx = ((tx == n) ? 1 : tx + 1);a[tx][ty] = ++fnum;x = tx, y = ty;}// 输出for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){cout << a[i][j] << " ";}cout << endl;}return 0;
}

[GESP202309 四级] 进制转换

题目描述

N N N 进制数指的是逢 N N N 进一的计数制。例如,人们日常生活中大多使用十进制计数,而计算机底层则一般使用二进制。除此之外,八进制和十六进制在一些场合也是常用的计数制(十六进制中,一般使用字母 A 至 F 表示十至十五;本题中,十一进制到十五进制也是类似的)。

在本题中,我们将给出 个不同进制的数。你需要分别把它们转换成十进制数。

输入格式

输入的第一行为一个十进制表示的整数 N N N。接下来 N N N 行,每行一个整数 K K K,随后是一个空格,紧接着是一个 K K K 进制数,表示需要转换的数。保证所有 K K K 进制数均由数字和大写字母组成,且不以 0 0 0 开头。保证 K K K 进制数合法。

保证 N ≤ 1000 N \le 1000 N1000;保证 2 ≤ K ≤ 16 2 \le K \le 16 2K16

保证所有 K K K 进制数的位数不超过 9 9 9

输出格式

输出 N N N 行,每一个十进制数,表示对应 K K K 进制数的十进制数值。

样例 #1

样例输入 #1

2
8 1362
16 3F0

样例输出 #1

754
1008

样例 #2

样例输入 #2

2
2 11011
10 123456789

样例输出 #2

27
123456789

提示

对于任意一个 L L L K K K 进制数,假设其最右边的数位为第 0 0 0 位,最左边的数位为第 L − 1 L-1 L1 位,我们只需要将其第 i i i 位的数码乘以权值 K i K^i Ki,再将每位的结果相加,即可得到原 K K K 进制数对应的十进制数。下面是两个例子:

  1. 八进制数 1362 对应的十进制数为: 1 × 8 3 + 3 × 8 2 + 6 × 8 1 + 2 × 8 0 = 754 1×8^3+3×8^2+6×8^1+2×8^0=754 1×83+3×82+6×81+2×80=754

  2. 十六进制数 3F0 对应的十进制数为: 3 × 1 6 2 + 15 × 1 6 1 + 0 × 1 6 0 = 1008 3×16^2+15×16^1+0×16^0=1008 3×162+15×161+0×160=1008

参考答案

// toDecimalNumber.cpp
// 字符串、进制
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;int n;
int len;
int base;
char num[15];
int num2[15];
long long sum;int main()
{cin >> n;while (n--){// 输入cin >> base >> num;// 转十进制数len = strlen(num);sum = 0;// 1. 转对应数字for (int i = 0; i < len; i++){if (num[i] >= '0' && num[i] <= '9'){num2[i] = num[i] - '0';}else{num2[i] = 10 + (num[i] - 'A');}}// 2. 权值展开求和for (int i = 0; i < len; i++){sum += num2[i] * pow(base, len-i-1);}// 上述内容可以合二为一// 输出cout << sum << endl;}return 0;
}

★[GESP202312 四级] 小杨的字典

题目描述

在遥远的星球,有两个国家 A 国和 B 国,他们使用着不同的语言:A 语言和 B 语言。小杨是 B 国的翻译官,他的工作是将 A 语言的文章翻译成 B 语言的文章。

为了顺利完成工作,小杨制作了一本字典,里面记录了 N N N 个 A 语言单词对应的 B 语言单词,巧合的是,这些单词都
由地球上的 26 个小写英文字母组成。

小杨希望你写一个程序,帮助他根据这本字典翻译一段 A 语言文章。这段文章由标点符号 !()-.[].{}\|;:'",./?<> 和一些 A 语言单词构成,每个单词之间必定由至少一个标点符号分割,你的程序需要把这段话中的所有 A 语言单词替换成它的 B 语言翻译。特别地,如果遇到不在字典中的单词,请使用大写 UNK 来替换它。

例如,小杨的字典中包含 2 2 2 个 A 语言单词 abcd,它们的 B 语言翻译分别为 adef,那么我们可以把 A 语言文章 abc.d.d.abc.abcd. 翻译成 B 语言文章 a.def.def.a.UNK. 其中,单词 abcd 不在词典内,因此我们需要使用 UNK 来替换它。

输入格式

第一行一个整数 N N N,表示词典中的条目数。保证 N ≤ 100 N \le 100 N100

接下来 N N N 行,每行两个用单个空格隔开的字符串 A A A B B B ,分别表示字典中的一个 A 语言单词以及它对应的 B 语言翻译。保证所有 A A A 不重复;保证 A A A B B B 的长度不超过 10 10 10

最后一行一个字符串 S S S ,表示需要翻译的 A 语言文章。保证字符串 S S S 的长度不超过 1000 1000 1000,保证字符串 S S S 只包含小写字母以及标点符号 !()-.[].{}\|;:'",./?<>

输出格式

输出一行,表示翻译后的结果。

样例 #1

样例输入 #1

2
abc a
d def
abc.d.d.abc.abcd

样例输出 #1

a.def.def.a.UNK

样例 #2

样例输入 #2

3
abc a
d def
abcd xxxx
abc,(d)d!-abc?abcd

样例输出 #2

a,(def)def!-a?xxxx

样例 #3

样例输入 #3

1
abcdefghij klmnopqrst
!()-[]{}\|;:'",./?<>abcdefghijklmnopqrstuvwxyz

样例输出 #3

!()-[]{}\|;:'",./?<>UNK

新知

在这类字符串替换的题目当中,我们一般使用 map 容器进行作答。

map 容器,是 STL 关联容器,它提供一对一的数据处理能力,很类似 Python 中的字典。这里的字典指的就是生活中的字典,会有东西和对应的解释两个部分组成。

map 容器也非常适合 [GESP202312 四级] 小杨的字典

map 容器的定义方法:

#include <map>
// 格式: map<查找东西的数据类型, 对应解释的数据类型> 容器名字;
// 示例:
map<string, string>dic; // 这个就是本题的定义方法

当然,[GESP202312 四级] 小杨的字典 也可以使用两个数组进行作答。

参考答案

// dictionary.cpp
#include <iostream>
#include <string>
#include <map>
using namespace std;int n;
string a, b;
string tmp;
string s, ans;
map<string, string>m;int main()
{// 输入cin >> n;for (int i = 1; i <= n; i++){cin >> a >> b;m[a] = b;}cin >> s;s += '.'; // 结束符for (char c : s){if (c >= 'a' && c <= 'z'){tmp += c;}else{if (tmp != ""){if (m.count(tmp)){ans += m[tmp];}else{ans += "UNK";}tmp = "";    }ans += c;}}ans.pop_back();// 输出cout << ans;return 0;
}

代码详解

代码意义
for (char c:s)for 循环迭代字符串 s 中的每个字符
if (c >= 'a' && c <= 'z')检查字符 c 是否是字母
tmp += c;将字符 c 添加到临时字符串 tmp 的末尾,成为目前单词的一个字符
else如果字符 c 不是小写字母
if (tmp != "")检查临时字符串 tmp 是否不为空,如果不为空则说明已构建一个完整的单词
if (m.count(tmp))检查容器 m 中是否存在临时字符串 tmp 作为查找的东西
ans += m[tmp];将容器 m 中临时字符串 tmp 对应的翻译添加到结果字符串 ans 的末尾
else如果容器 m 中不存在临时字符串 tmp 作为查找的东西
ans += "UNK";"UNK" 添加到结果字符串 ans 的末尾,表示没有查询到
tmp = "";将临时字符串 tmp 重置为空,以便构建下一个单词
ans += c;将标点符号字符 c 添加到结果字符串 ans 的末尾
ans.pop_back();移除结果字符串 ans 的最后一个字符,因为它不是一个单词

[GESP202403 四级] 相似字符串

题目描述

对于两个字符串 A A A B B B,如果 A A A 可以通过删除一个字符,插入一个字符,修改一个字符变成 B B B,那么我们说 A A A B B B 是相似的。

比如 apple \texttt{apple} apple 可以通过插入一个字符变成 applee \texttt{applee} applee,可以通过删除一个字符变成 appe \texttt{appe} appe,也可以通过修改一个字符变成 bpple \texttt{bpple} bpple。因此 apple \texttt{apple} apple applee \texttt{applee} applee appe \texttt{appe} appe bpple \texttt{bpple} bpple 都是相似的。但 applee \texttt{applee} applee 并不能 通过任意一个操作变成 bpple \texttt{bpple} bpple,因此它们并不相似。

特别地,两个完全相同的字符串也是相似的。

给定 T T T A , B A,B A,B,请你分别判断它们是否相似。

输入格式

第一行一个正整数 T T T
接下来 T T T 行,每行两个用空格隔开的字符串 A A A B B B

输出格式

对组 A , B A,B A,B,如果他们相似,输出 similar,否则输出 not similar

样例 #1

样例输入 #1

5
apple applee
apple appe
apple bpple
applee bpple
apple apple

样例输出 #1

similar
similar
similar
not similar
similar

提示

对全部的测试数据,保证 1 ≤ T ≤ 100 1 \leq T \leq 100 1T100 A A A B B B 的长度不超过 50 50 50,仅含小写字母。

参考答案

// similarString.cpp
// 字符串、双指针
#include <iostream>
#include <string>
#include <cmath>
using namespace std;int T;
string A, B;bool isSimilar(string A, string B)
{// 两者完全相同if (A == B) return true;// 初始化int m = A.length();int n = B.length();int cnt = 0; // 记录变化字符数量int l = 0, r = 0; // 记录插入、删除的位置// 长度差大于1if (abs(m-n) > 1) return false;// 两者长度相等,判断是否只修改了一个字符else if (m - n == 0){for (int i = 0; i < m; i++){if (A[i] != B[i]) cnt++;if (cnt > 1) return false;}}// 两者长度相差1else{// B比A多一个字符,判断是否插入一个字符if (m - n == -1){int i = 0, j = 0;while (i < m){if (A[i] != B[j]){// 记录插入的位置l = i;r = j;// 直接比较后面的字符是否相等while (i < m && j < n){if (A[i] != B[j+1]) return false;i++;j++;}// 如果后面的字符都相等,则必须是A的剩余字符都相等if (i < m) return false;break;}else{i++;j++;}}}// A比B多一个字符,判断是否删除一个字符else{int i = 0, j = 0;while (i < m){if (A[i] != B[j]){// 记录删除的位置l = j;r = i;// 直接比较后面的字符是否相等while (i < m && j < n){if (A[i+1] != B[j]) return false;i++;j++;}// 如果后面的字符都相等,则必须是B的剩余字符都相等if (j < n) return false;break;}else{i++;j++;}}}}return true;
}int main()
{cin >> T;while (T--){cin >> A >> B;cout << (isSimilar(A, B) ? "similar\n" : "not similar\n");}return 0;
}

这篇关于GESP 四级题单(简单) • 附免费参考答案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/956197

相关文章

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

uva 10387 Billiard(简单几何)

题意是一个球从矩形的中点出发,告诉你小球与矩形两条边的碰撞次数与小球回到原点的时间,求小球出发时的角度和小球的速度。 简单的几何问题,小球每与竖边碰撞一次,向右扩展一个相同的矩形;每与横边碰撞一次,向上扩展一个相同的矩形。 可以发现,扩展矩形的路径和在当前矩形中的每一段路径相同,当小球回到出发点时,一条直线的路径刚好经过最后一个扩展矩形的中心点。 最后扩展的路径和横边竖边恰好组成一个直

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 10130 简单背包

题意: 背包和 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>

荣耀嵌入式面试题及参考答案

在项目中是否有使用过实时操作系统? 在我参与的项目中,有使用过实时操作系统。实时操作系统(RTOS)在对时间要求严格的应用场景中具有重要作用。我曾参与的一个工业自动化控制项目就采用了实时操作系统。在这个项目中,需要对多个传感器的数据进行实时采集和处理,并根据采集到的数据及时控制执行机构的动作。实时操作系统能够提供确定性的响应时间,确保关键任务在规定的时间内完成。 使用实时操作系统的

免费也能高质量!2024年免费录屏软件深度对比评测

我公司因为客户覆盖面广的原因经常会开远程会议,有时候说的内容比较广需要引用多份的数据,我记录起来有一定难度,所以一般都用录屏工具来记录会议内容。这次我们来一起探索有什么免费录屏工具可以提高我们的工作效率吧。 1.福晰录屏大师 链接直达:https://www.foxitsoftware.cn/REC/  录屏软件录屏功能就是本职,这款录屏工具在录屏模式上提供了多种选项,可以选择屏幕录制、窗口

HomeBank:开源免费的个人财务管理软件

在个人财务管理领域,找到一个既免费又开源的解决方案并非易事。HomeBank&nbsp;正是这样一个项目,它不仅提供了强大的功能,还拥有一个活跃的社区,不断推动其发展和完善。 开源免费:HomeBank 是一个完全开源的项目,用户可以自由地使用、修改和分发。用户友好的界面:提供直观的图形用户界面,使得非技术用户也能轻松上手。数据导入支持:支持从 Quicken、Microsoft Money

JAVA用最简单的方法来构建一个高可用的服务端,提升系统可用性

一、什么是提升系统的高可用性 JAVA服务端,顾名思义就是23体验网为用户提供服务的。停工时间,就是不能向用户提供服务的时间。高可用,就是系统具有高度可用性,尽量减少停工时间。如何用最简单的方法来搭建一个高效率可用的服务端JAVA呢? 停工的原因一般有: 服务器故障。例如服务器宕机,服务器网络出现问题,机房或者机架出现问题等;访问量急剧上升,导致服务器压力过大导致访问量急剧上升的原因;时间和