• C++
  • C++ 数位操作与字符串处理课程笔记

  • @ 2025-7-16 19:30:04

C++ 数位操作与字符串处理课程笔记

一、课程概述

本次课程围绕 C++ 编程,涵盖字符串处理(忽略大小写、空格判断相等)与数位操作相关题目,通过实际代码案例,学习字符串遍历、转换、处理,以及利用循环、条件判断进行数位相关计算,理解编程逻辑与算法实现。

二、字符串处理案例——字符串判等

(一)题目回顾(2049:【例5.19】字符串判等 )

判断两个由大小写字母和空格组成的字符串,在忽略大小写、忽略空格后是否相等,相等输出 YES,否则输出 NO

(二)代码实现与解析

#include <iostream>
#include <string>
using namespace std;

int main() {
    // 定义两个字符串变量,用于存储输入的两行字符串
    string s1, s2;
    // getline 函数可读取一行带空格的字符串
    getline(cin, s1);
    getline(cin, s2);

    // 1. 转换为小写:利用范围 for 循环遍历字符串每个字符,tolower 函数转小写
    for (char& c : s1) { 
        c = tolower(c); 
    }
    for (char& c : s2) {
        c = tolower(c);
    }

    // 2. 去除空格:遍历字符串,将非空格字符拼接新字符串
    string s11, s22;
    for (char& c : s1) {
        if (c != ' ') { 
            s11 += c; 
        }
    }
    for (char& c : s2) {
        if (c != ' ') {
            s22 += c;
        }
    }

    // 3. 判断处理后的字符串是否相等并输出结果
    if (s11 == s22) {
        cout << "YES" << endl;
    } else {
        cout << "NO" << endl;
    }

    return 0;
}

关键步骤说明

  • getline(cin, s):读取一行输入到字符串 s,可保留空格,区别于 cin >> s(遇空格停止读取 )。
  • 范围 for 循环(for (char& c : s)):C++11 特性,便捷遍历字符串每个字符,& 表示引用,直接修改原字符 。
  • tolower(c):把字符 c 转小写,需包含 <cctype> 头文件(示例中因编译器特性可能未显式包含也能运行,建议添加 )。
  • 去除空格:通过遍历,筛选非空格字符拼接新字符串,实现忽略空格比较。

三、数位操作基础——以“数三角形”题目为例

(一)题目回顾(4123:【GESP2506二级】数三角形 )

直角三角形面积公式为 ab/2ab 为直角边 ),计算当 ab 均为不超过 n 的正整数时,面积为整数的不同直角三角形数量(a,bb,a 视为同一个三角形 )。

(二)代码实现与解析

#include <iostream>
using namespace std;

int main() {
    int n;
    // 输入直角边最大值 n
    cin >> n; 
    // 计数器,统计符合条件的三角形数量
    int cnt = 0; 

    // 双重循环遍历直角边 a 和 b,a 从 1 到 n,b 从 a 到 n(避免重复计数,如 a=2,b=3 和 a=3,b=2 算同一个 )
    for (int a = 1; a <= n; a++) { 
        for (int b = a; b <= n; b++) { 
            // 面积为整数条件:ab 能被 2 整除(即 ab % 2 == 0 )
            if (a * b % 2 == 0) { 
                cnt++; 
            }
        }
    }

    // 输出符合条件的三角形数量
    cout << cnt << endl; 
    return 0;
}

关键逻辑说明

  • 双重循环设计:外层 a1n,内层 ba 开始,保证 a ≤ b,避免重复统计(如 a=2,b=3a=3,b=2 是同一个三角形 )。
  • 面积整数条件:ab/2 为整数等价于 ab 是偶数,即 a * b % 2 == 0 ,通过此条件筛选符合要求的 ab 组合。

四、数位操作拓展任务(课后任务思路)

(一)数字黑洞(B3866):数位重组与减法循环

题目大意:对给定数字,重复“数位重组最大数 - 数位重组最小数”操作,最终陷入数字黑洞(如 495 ),需编程模拟此过程。
实现思路

  1. 写函数将数字拆分为单个数字并存入数组,再分别重组最大、最小数。
  2. 循环执行“最大数 - 最小数”,直到结果进入黑洞(固定值 ),记录每一步结果。
    示例代码片段(核心逻辑 ):
// 函数:将数字转为最大数,如 123→321
int maxNum(int num) {
    int digit[10] = {0}, i = 0;
    while (num > 0) {
        digit[i++] = num % 10;
        num /= 10;
    }
    // 排序(降序)
    for (int j = 0; j < i - 1; j++) {
        for (int k = j + 1; k < i; k++) {
            if (digit[j] < digit[k]) {
                swap(digit[j], digit[k]);
            }
        }
    }
    int res = 0;
    for (int j = 0; j < i; j++) {
        res = res * 10 + digit[j];
    }
    return res;
}
// 类似实现 minNum 函数...
// 主逻辑循环减法
int main() {
    int num;
    cin >> num;
    while (num != 495 && num != 6174) { // 不同位数黑洞值不同,如三位数 495,四位数 6174
        int maxN = maxNum(num);
        int minN = minNum(num);
        num = maxN - minN;
        cout << maxN << " - " << minN << " = " << num << endl;
    }
    return 0;
}

(二)数位之和(B4036):多位数的数位和计算

题目大意:输入一个数,计算其各位数字之和。
实现思路: 通过循环取余(num % 10 )、整除(num / 10 )拆分数字,累加求和。
代码示例:

#include <iostream>
using namespace std;

int main() {
    int num, sum = 0;
    cin >> num;
    while (num > 0) {
        // 取个位数字累加
        sum += num % 10; 
        // 去掉个位数字
        num /= 10; 
    }
    cout << sum << endl;
    return 0;
}

(三)寻找数字(B4064):查找数位中特定数字

题目大意:输入一个数和目标数字,判断目标数字是否在数的各位中出现。
实现思路: 循环拆分数字,逐一与目标数字比较,找到则标记并退出循环。
代码示例:

#include <iostream>
using namespace std;

int main() {
    int num, target;
    cin >> num >> target;
    bool found = false;
    while (num > 0) {
        if (num % 10 == target) {
            found = true;
            break;
        }
        num /= 10;
    }
    cout << (found ? "YES" : "NO") << endl;
    return 0;
}

(四)数位和(B4065):数位和的统计与比较

题目大意:可能涉及计算多个数的数位和,再进行统计(如统计数位和为某值的数的个数 )或比较操作,需结合具体题目要求实现。
通用思路: 先通过类似“数位之和”的方法,封装计算数位和的函数,再根据题目逻辑(如遍历范围、统计条件 )进行处理。
示例框架(假设统计 1 - n 中数位和为 s 的数的个数 ):

#include <iostream>
using namespace std;

// 计算数位和函数
int digitSum(int num) {
    int sum = 0;
    while (num > 0) {
        sum += num % 10;
        num /= 10;
    }
    return sum;
}

int main() {
    int n, s, cnt = 0;
    cin >> n >> s;
    for (int i = 1; i <= n; i++) {
        if (digitSum(i) == s) {
            cnt++;
        }
    }
    cout << cnt << endl;
    return 0;
}

五、总结

  1. 字符串处理:掌握 getline 读取带空格字符串,范围 for 循环遍历字符,tolower 等字符转换函数,以及通过拼接新字符串处理特殊需求(如忽略空格 )。
  2. 数位操作:利用循环和数学运算(取余、整除 )拆分数字,实现数位和计算、数字筛选、组合统计等功能,解决与数位相关的编程问题。
  3. 算法思维:通过双重循环、函数封装、条件判断等,处理重复操作和复杂逻辑,培养分解问题、逐步实现的编程思维,为解决更复杂算法题打基础 。

多动手实践课后任务,尝试优化代码(如用更高效算法、减少冗余操作 ),加深对知识点的理解与运用!

0 条评论

目前还没有评论...