2025 年 12 月青少年软编等考 C 语言二级真题解析

目录

T1. 一半

题目链接:SOJ D1440

给定一个长度为 4 4 4 的大写字母字符串 S S S,请判断它是否满足以下两个条件:字符串中恰好包含两种不同字母;这两种字母都恰好出现两次。

时间限制:1 s

内存限制:256 MB

  • 输入
    一个字符串 S S S, S S S 一定是长度为 4 4 4 的大写字符串。

  • 输出
    如果满足条件,输出 Yes,否则输出 No

  • 样例输入 1

    a 复制代码
    MAMA
  • 样例输出 1

    a 复制代码
    Yes
  • 样例输入 2

    a 复制代码
    DEED
  • 样例输出 2

    a 复制代码
    Yes
  • 样例输入 3

    a 复制代码
    PEER
  • 样例输出 3

    a 复制代码
    No

思路分析

此题考察字符串遍历,属于入门题。

可以用一个数组统计出每个字符出现的次数,然后进行检测:多于 2 2 2 个不同的字符则不满足条件;出现过的字符中,任一字符出现次数不是 2 2 2 次则不满足条件。

较为简单的方法是对字符串进行排序,如果要满足条件,那么应该前 2 2 2 个字符相同,后 2 2 2 个字符相同,中间 2 2 2 个字符不相同。

cpp 复制代码
/*
 * Name: T1.cpp
 * Problem: 一半
 * Author: Teacher Gao.
 * Date&Time: 2026/01/21 16:03
 */

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    ios::sync_with_stdio(false), cin.tie(0);

    string s;
    cin >> s;

    sort(s.begin(), s.end());
    if (s[0] == s[1] && s[1] != s[2] && s[2] == s[3]) {
        cout << "Yes\n";
    }
    else {
        cout << "No\n";
    }

    return 0;
}

T2. 打印锯齿

题目链接:SOJ D1441

给定一个整数 n n n,请打印一个锯齿图形,这个锯齿应该分成 n n n 段,每段形如 /\

时间限制:1 s

内存限制:256 MB

  • 输入
    单个整数:表示 n n n, 1 ≤ n ≤ 10 5 1\le n\le 10^5 1≤n≤105。

  • 输出
    输出该锯齿图形。

  • 样例输入 1

    a 复制代码
    4
  • 样例输出 1

    a 复制代码
    /\/\/\/\
  • 样例输入 2

    a 复制代码
    9
  • 样例输出 2

    a 复制代码
    /\/\/\/\/\/\/\/\/\

思路分析

此题考察循环结构,属于入门题。

按照题意进行输出即可,注意输出反斜杠 \ 时,需要使用转义字符 '\\'

cpp 复制代码
/*
 * Name: T2.cpp
 * Problem: 打印锯齿
 * Author: Teacher Gao.
 * Date&Time: 2026/01/21 16:16
 */

#include <iostream>

using namespace std;

int main()
{
    ios::sync_with_stdio(false), cin.tie(0);

    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cout << "/\\";
    }

    return 0;
}

T3. 充电宝

题目链接:SOJ D1442

有一块电量为 n n n 的充电宝,她计划给若干块电池充电,每次充电时会有一定电量的损失,使用电量 a i a_i ai 时,其损失电量为 f ( a i ) f(a_i) f(ai), f ( x ) f(x) f(x) 表示除 x x x 以外 x x x 的最大因子。注意:若只充电 1 1 1 点,其损失电量也为 1 1 1。

应该如何分配用光电量,使得损失总量最小。

时间限制:1 s

内存限制:256 MB

  • 输入
    输入一个正数表示总电量 n n n, 2 ≤ n ≤ 2 × 10 9 2\le n\le 2\times10^9 2≤n≤2×109。

  • 输出
    输出最小损失电量。

  • 样例输入 1

    a 复制代码
    4
  • 样例输出 1

    a 复制代码
    2
  • 样例输入 2

    a 复制代码
    9
  • 样例输出 2

    a 复制代码
    2

思路分析

此题考察数论中的哥德巴赫猜想,属于思维题。虽然哥德巴赫猜想至今未被证明,但是在题目的限定范围 2 × 10 9 2\times 10^9 2×109 之内是没有反例的,因此本题可用。

由于每个素数只有两个因子,除去它本身之外,最大的因子就是 1 1 1,因此每次使用的电量为素数时,损失电量最少。要想总损失最小,就应将总电量 n n n 分解为最少数量的素数。

  • 如果 n n n 是素数,损失为 1 1 1;
  • 如果 n n n 是偶数(且不是素数),根据哥德巴赫猜想,偶数可以拆分为两个素数之和,损失为 2 2 2;
  • 如果 n n n 是奇数(且不是素数),先尝试将 n n n 分解为 2 2 2 和 n − 2 n-2 n−2,
    • 如果 n − 2 n-2 n−2 是素数,则损失为 2 2 2;
    • 如果 n − 2 n-2 n−2 不是素数,则由于 n − 3 n-3 n−3 是偶数,根据哥德巴赫猜想,可以将 n − 3 n-3 n−3 分解为两个素数之和,于是损失为 3 3 3。
cpp 复制代码
/*
 * Name: T3.cpp
 * Problem: 充电宝
 * Author: Teacher Gao.
 * Date&Time: 2026/01/26 19:33
 */

#include <iostream>

using namespace std;

bool isPrime(int x) {
    if (x <= 1) return 0;
    if (x == 2) return 1;
    if (x % 2 == 0) return 0;
    for (int i = 3; i * i <= x; i += 2) {
        if (x % i == 0) return 0;
    }
    return 1;
}

int main()
{
    ios::sync_with_stdio(false), cin.tie(0);

    int n, ans;
    cin >> n;

    if (isPrime(n)) ans = 1;
    else if (n % 2 == 0) ans = 2;
    else {
        if (isPrime(n - 2)) ans = 2;
        else ans = 3;
    }

    cout << ans << endl;

    return 0;
}

T4. 漫画书

题目链接:SOJ D1443

一套漫画书共有 n n n 册,第 i i i 册包含 a i a_i ai 个章节。已知全书总章节数是奇数。如果把第 1 1 1 册第 1 1 1 章算作整册书的第 1 1 1 章,那么这套书正中间的那一章位于第几册第几章?

时间限制:1 s

内存限制:256 MB

  • 输入
    第一行:一个整数 n n n, 1 ≤ n ≤ 100 1\le n\le 100 1≤n≤100。
    第二行: n n n 个整数 a 1 , a 2 , ... , a n a_1,a_2,...,a_n a1,a2,...,an,用空格隔开, 1 ≤ a i ≤ 100 1\le a_i\le 100 1≤ai≤100。保证书的章节总数为奇数。

  • 输出
    两个整数 a , b a, b a,b,表示正中间那一章在第 a a a 册第 b b b 章,用空格分隔。

  • 样例输入 1

    a 复制代码
    1
    1
  • 样例输出 1

    a 复制代码
    1 1
  • 样例输入 2

    a 复制代码
    12
    28 31 31 30 31 30 31 31 30 31 31 30
  • 样例输出 2

    a 复制代码
    7 2

思路分析

此题考察一维数组的使用,属于入门题。

首先计算出正中间章节数 s u m sum sum,然后从第一册开始依次尝试累加,如果加上当前册之后章节数超过 s u m sum sum,便确定了正中间就在当前册,再用 s u m sum sum 减去前面的总章节数便得到了正中间的章节数。

cpp 复制代码
/*
 * Name: T4.cpp
 * Problem: 漫画书
 * Author: Teacher Gao.
 * Date&Time: 2026/01/26 20:28
 */

#include <iostream>

using namespace std;

int main()
{
    ios::sync_with_stdio(false), cin.tie(0);

    int n, a[105] = {0}, sum = 0;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        sum += a[i];
    }

    sum = sum / 2 + 1;
    int cnt = 0, x = 1;
    while (cnt + a[x] < sum) cnt += a[x++];
    
    cout << x << " " << sum - cnt << endl;

    return 0;
}

T5. 实心正方形

题目链接:SOJ D1444

给定一个整数 n n n,请打印一个实心的正方形,它的边界由星号 * 构成,内部由 · 填充,每条边都恰好有 n n n 个星号。

时间限制:1 s

内存限制:256 MB

  • 输入
    单个整数:表示 n n n, 3 ≤ n ≤ 1000 3\le n\le 1000 3≤n≤1000。

  • 输出
    输出一个边界为星号、内部为点的正方形。

  • 样例输入 1

    a 复制代码
    5
  • 样例输出 1

    a 复制代码
    *****
    *...*
    *...*
    *...*
    *****
  • 样例输入 2

    a 复制代码
    3
  • 样例输出 2

    a 复制代码
    ***
    *.*
    ***

思路分析

此题考察循环结构,属于入门题。

使用两层循环分别控制行和列,并检测行号和列号是否为边界,如果是边界则输出 '*',否则输出 '.'

cpp 复制代码
/*
 * Name: T5.cpp
 * Problem: 实心正方形
 * Author: Teacher Gao.
 * Date&Time: 2026/01/26 20:53
 */

#include <iostream>

using namespace std;

int main()
{
    ios::sync_with_stdio(false), cin.tie(0);

    int n;
    cin >> n;
    
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if (i % n <= 1 || j % n <= 1) {
                cout << "*";
            }
            else {
                cout << ".";
            }
        }
        cout << "\n";
    }

    return 0;
}
相关推荐
Maỿbe1 小时前
重走力扣hot的矩阵
算法·leetcode·矩阵
2301_790300961 小时前
C++与增强现实开发
开发语言·c++·算法
zmzb01032 小时前
C++课后习题训练记录Day82
开发语言·c++
每天要多喝水2 小时前
贪心算法专题Day18
算法·贪心算法
Howrun7772 小时前
C++ 文件操作速查手册
c++
我要神龙摆尾2 小时前
约定俗成的力量--java中泛型的意义和用法
java·开发语言
漂洋过海的鱼儿2 小时前
Qt-界面子类(1)
开发语言·qt
C++ 老炮儿的技术栈2 小时前
不调用C++/C的字符串库函数,编写函数strcmp
c语言·开发语言·c++·人工智能·windows·git·visual studio
茉莉玫瑰花茶2 小时前
脚手架介绍
c++