- 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/2
(a
、b
为直角边 ),计算当 a
、b
均为不超过 n
的正整数时,面积为整数的不同直角三角形数量(a,b
与 b,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;
}
关键逻辑说明:
- 双重循环设计:外层
a
从1
到n
,内层b
从a
开始,保证a ≤ b
,避免重复统计(如a=2,b=3
和a=3,b=2
是同一个三角形 )。 - 面积整数条件:
ab/2
为整数等价于ab
是偶数,即a * b % 2 == 0
,通过此条件筛选符合要求的a
、b
组合。
四、数位操作拓展任务(课后任务思路)
(一)数字黑洞(B3866):数位重组与减法循环
题目大意:对给定数字,重复“数位重组最大数 - 数位重组最小数”操作,最终陷入数字黑洞(如 495 ),需编程模拟此过程。
实现思路:
- 写函数将数字拆分为单个数字并存入数组,再分别重组最大、最小数。
- 循环执行“最大数 - 最小数”,直到结果进入黑洞(固定值 ),记录每一步结果。
示例代码片段(核心逻辑 ):
// 函数:将数字转为最大数,如 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;
}
五、总结
- 字符串处理:掌握
getline
读取带空格字符串,范围for
循环遍历字符,tolower
等字符转换函数,以及通过拼接新字符串处理特殊需求(如忽略空格 )。 - 数位操作:利用循环和数学运算(取余、整除 )拆分数字,实现数位和计算、数字筛选、组合统计等功能,解决与数位相关的编程问题。
- 算法思维:通过双重循环、函数封装、条件判断等,处理重复操作和复杂逻辑,培养分解问题、逐步实现的编程思维,为解决更复杂算法题打基础 。
多动手实践课后任务,尝试优化代码(如用更高效算法、减少冗余操作 ),加深对知识点的理解与运用!
0 条评论
目前还没有评论...