蓝桥省赛题测试

#include <iostream>  // 包含输入输出流头文件,用于cin和cout操作
using namespace std; // 使用标准命名空间,避免重复写std::

int main() {
    int n;  // 定义变量n,用于存储输入的字母个数
    cin >> n;  // 从标准输入读取n的值

    char arr[100];  // 定义字符数组arr,最多存储100个字符(题目中n<100)
    for (int i = 0; i < n; i++) {  // 循环n次读取输入的字母
        cin >> arr[i];  // 将第i个输入的字母存入数组arr的第i个位置
    }

    // 冒泡排序:将数组按字典序(ASCII码升序)排序
    // 外层循环控制排序轮数,共需要n-1轮(因为最后一个元素不需要再比较)
    for (int i = 0; i < n - 1; i++) {
        // 内层循环控制每轮比较的次数,每轮结束后最大的元素会被放到最后
        for (int j = 0; j < n - i - 1; j++) {
            // 比较相邻的两个字符,如果前一个字符大于后一个(字典序靠后)
            if (arr[j] > arr[j + 1]) {
                // 交换两个字符的位置,保证较小的字符向前移动
                char temp = arr[j];      // 临时变量保存前一个字符
                arr[j] = arr[j + 1];     // 后一个字符前移
                arr[j + 1] = temp;       // 前一个字符后移
            }
        }
    }

    // 输出排序后的字符数组(即组合后的字符串)
    for (int i = 0; i < n; i++) {
        cout << arr[i];  // 按顺序输出每个字符
    }
    cout << endl;  // 输出换行符(根据题目要求可选,但通常保留)

    return 0;  // 程序正常结束,返回0
}

代码解释总结

  1. 输入处理:通过cin读取字母个数n,再循环读取n个字母存入字符数组arr
  2. 冒泡排序:通过双重循环实现排序。外层循环控制轮数(共n-1轮),内层循环控制每轮的比较次数(每轮减少i次,因为已有i个元素已排好序)。通过比较相邻字符的 ASCII 码,将较大的字符逐步 “冒泡” 到数组末尾。
  3. 输出结果:循环遍历排序后的数组,将所有字符依次输出,形成最终的字典序字符串。

测试样例验证

以输入样例为例:

plaintext

4
c d a c

  • 输入后数组初始为['c', 'd', 'a', 'c']
  • 排序过程:
    • 第 1 轮(i=0):比较 3 次,最终数组变为['c', 'a', 'c', 'd'](最大的d移到末尾)。
    • 第 2 轮(i=1):比较 2 次,最终数组变为['a', 'c', 'c', 'd'](次大的c移到倒数第二)。
    • 第 3 轮(i=2):比较 1 次,数组保持['a', 'c', 'c', 'd'](已完全有序)。
  • 输出结果为accd,与题目要求一致。

题目要求计算从正整数 n 开始的连续 25 个整数的和,即求 n + (n+1) + (n+2) + ... + (n+24) 的值。
这是一个典型的等差数列求和问题:

  • 首项 a₁ = n
  • 末项 aₙ = n + 24(因为从 n 开始连续 25 个数,最后一个数是 n+24
  • 项数 k = 25
  • 计算结果:依据等差数列求和公式 S = m * a1 + m * (m - 1) * d / 2 来计算从 n 开始的连续 25 个整数的和。
    其中 m 代表项数,这里是 25;a1 是首项,即 n;d 是公差,为 1。
    所以 result = 25 * n + 25 * (25 - 1) * 1 / 2; 计算出了最终的和。

根据等差数列求和公式:
和 = (首项 + 末项) × 项数 / 2
代入数据后得到:
和 = (n + (n + 24)) × 25 / 2 = (2n + 24) × 25 / 2 = (n + 12) × 25

解决代码

cpp

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    cout << (n + 12) * 25 << endl;
    return 0;
}

代码解释

  1. 输入处理:使用 cin 读取输入的正整数 n
  2. 计算和:根据推导的公式 (n + 12) * 25 直接计算结果。
  3. 输出结果:使用 cout 输出计算结果。

考点与重点

  • 等差数列求和公式:核心考点是对等差数列求和公式的理解和应用。本题中连续整数构成公差为 1 的等差数列,可直接用公式简化计算。
  • 数学化简能力:通过代数运算将公式 (n + (n + 24)) * 25 / 2 化简为 (n + 12) * 25,减少计算步骤,提高效率。
  • 输入输出处理:C++ 中 cin 和 cout 的基本使用方法。

教学方案

  1. 复习等差数列:先回顾等差数列的定义(公差、首项、末项、项数),强调连续整数是公差为 1 的等差数列。
  2. 推导求和公式:通过具体例子(如 n=1 时计算 1+2+...+25),引导学生推导等差数列求和公式。
  3. 公式化简:演示如何将 (n + (n + 24)) * 25 / 2 化简为 (n + 12) * 25,解释化简的意义(减少计算量)。
  4. 代码实现:讲解 C++ 中输入输出的基本操作,强调直接使用化简后的公式计算的高效性。
  5. 验证样例:用题目中的样例(如输入 1 输出 325,输入 100 输出 2800)验证代码正确性,确保学生理解公式的应用。

问题分析

题目要求找出 1 到 n 中所有数位包含 0、1、2、9 的整数(不包括前导 0),并求它们的和。例如,当 n=40 时,符合条件的数有 28 个,和为 574。

解题思路

#include <iostream>
using namespace std;
int main() {
    int n;
    cin >> n;
    int sum = 0;
    for (int i = 1; i <= n; i++) {
        int num = i;
        while (num > 0) {
            int d = num % 10;
            if (d == 2 || d == 0 || d == 1 || d == 9) {
                sum += i;
                break;
            }
            num /= 10;
        }
    }
    cout << sum << endl;
    return 0;
}

// 包含输入输出流库的头文件,这样程序才能进行标准输入输出操作
#include <iostream>
// 使用标准命名空间std,后续使用std命名空间中的标识符时无需加std::前缀
using namespace std;
// 程序的主函数,程序执行从这里开始,返回一个整数值
int main() {
    // 声明一个整型变量n,用于存储用户输入的整数
    int n;
    // 从标准输入(通常是键盘)读取一个整数,并将其存储到变量n中
    cin >> n;
    // 声明一个整型变量sum,用于累加满足条件的整数,初始值设为0
    int sum = 0;
    // for循环,从1开始遍历到n,i为循环变量
    for (int i = 1; i <= n; i++) {
        // 声明一个整型变量num,并将i的值赋给它,用于后续处理,避免修改i的值
        int num = i;
        // while循环,只要num大于0,就会持续循环,用于逐位检查num的每一位数字
        while (num > 0) {
            // 取num的最后一位数字,存储到变量d中
            int d = num % 10;
            // 条件判断,如果d等于2或者等于0或者等于1或者等于9
            if (d == 2 || d == 0 || d == 1 || d == 9) {
                // 若满足条件,将当前的i累加到sum中
                sum += i;
                // 跳出当前的while循环,因为已经确定i满足条件,无需再检查i的其他位
                break;
            }
            // 将num除以10,去掉最后一位数字,继续检查剩下的数字
            num /= 10;
        }
    }
    // 将累加的结果sum输出到标准输出(通常是屏幕),并换行
    cout << sum << endl;
    // 主函数返回0,表示程序正常结束
    return 0;
}    

分解题型:1到20之间,是否包含3,如果包含计算个数

继续拆解:

0,使用for输出100到123的十位是否包含1,如果包含输出YES

1,使用for循环输出100到123所有整数

2,只输出1到20所有数个位

3,再输出1到20所有数的十位

4,计算1到20之间是否包含3,如果包含,输出包含

5,计算1到30之间是否个位和十位包含有3,如果有输出包含

6,使用累加器计算所包含的个数

7,控制几到几之间,输入一个数字,是循环从1到你输入的数字

问题分析

题目要求将输入字符串中的所有小写字母转换为大写字母后输出。核心是识别小写字母并利用 ASCII 码特性进行转换。

解题思路

  1. 字符编码特性:小写字母 a-z 的 ASCII 码范围是 97-122,对应的大写字母 A-Z 的 ASCII 码是 65-90。每个小写字母比对应大写字母的 ASCII 码大 32(例如 'a'=97'A'=6597-65=32)。
  2. 遍历字符串:逐个检查字符串中的每个字符,若为小写字母(c >= 'a' && c <= 'z'),则将其 ASCII 码减 32 转换为大写。

解决代码

cpp

#include <iostream>
using namespace std;

int main() {
    char str[101];  // 定义字符数组存储输入(最大长度100+1个结束符)
    cin.getline(str, 101);  // 读取整行输入(包括空格)

    // 遍历字符串,转换小写字母为大写
    for (int i = 0; str[i] != '\0'; ++i) {
        if (str[i] >= 'a' && str[i] <= 'z') {  // 判断是否为小写字母
            str[i] -= 32;  // 转换为大写(ASCII码减32)
        }
    }

    cout << str << endl;  // 输出转换后的字符串
    return 0;
}

代码解释

  1. 输入处理

    • 定义字符数组 str[101] 存储输入(长度 101 确保能容纳最大 100 字符的字符串和结束符 \0)。
    • 使用 cin.getline(str, 101) 读取整行输入(包括空格),避免 cin 遇到空格提前终止的问题。
  2. 字符转换

    • 遍历字符数组,条件 str[i] != '\0' 确保在字符串结束符前停止。
    • 若字符是小写字母('a' 到 'z'),则通过 str[i] -= 32 将其转换为大写(如 'a' 变为 'A')。
  3. 输出结果:直接输出转换后的字符数组。

考点与重点

  1. ASCII 码的应用:掌握大小写字母的 ASCII 码差值(32),并利用这一特性进行转换。
  2. C 风格字符串处理:使用字符数组存储字符串,通过遍历逐个处理字符,理解字符串以 \0 结尾的特性。
  3. 输入输出处理:使用 cin.getline 读取包含空格的整行输入,避免输入截断。

教学方案

  1. ASCII 码基础

    • 展示常见字符的 ASCII 码(如 'A'=65'a'=97'B'=66'b'=98),强调大小写字母的差值固定为 32。
  2. 字符串存储与遍历

    • 讲解 C 风格字符串的存储方式(字符数组 + 结束符 \0),演示如何通过循环 for (int i=0; str[i]!='\0'; i++) 遍历字符串。
  3. 条件判断与转换逻辑

    • 通过示例(如字符 'm'),演示如何判断是否为小写字母('a' <= c <= 'z'),并手动计算转换后的大写('m'-32='M')。
  4. 输入输出验证

    • 用样例输入 LanQiao 验证代码:原字符串中的 anqiao 是小写,转换后变为 ANQIAO,最终输出 LANQIAO
  5. 易错点提醒

    • 字符串数组的大小需足够(如 char str[101]),避免溢出。
    • 输入包含空格时,必须用 cin.getline 而非 cin >>(后者会截断空格)。

测试验证

  • 输入 LanQiao,输出 LANQIAO(与样例一致)。
  • 输入 Hello World!,输出 HELLO WORLD!(空格和非字母字符保持不变)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值