C++.备考知识点
C++备考知识点
- 1. 循环结构与等差数列求和
- 1.1 逐天累加实现方法
- 1.2 等差数列求和公式优化
- 2.1 数字转字符串方法
- 2.2 首尾字符交换实现
- 2.3 去除前导零技巧
- 3.1 异或运算基本性质
- 3.2 找出出现奇数次的数
- 问题分析
- 示例代码
- 输出结果
- 扩展应用
- 4.1 字符位移量计算
- 问题分析
- 示例代码
- 输出结果
- 扩展应用
- 4.2 步骤奇偶性判断
- 问题分析
- 示例代码
- 输出结果
- 扩展应用
- 4.3 模26处理循环移位
- 问题分析
- 示例代码
- 输出结果
- 扩展应用
- 5.1 取模运算原理
- 特点
- 应用场景
- 示例代码
- 扩展应用
- 5.2 4 % 12 的计算过程
- 示例代码
- 输出结果
- 扩展应用
- 6.1 转义字符的作用
- 常见的转义字符
- 转义字符的应用场景
- 示例代码
- 输出结果
- 6.2 char a[] = "hello\nworld" 的输出分析
- 示例代码
- 输出结果
- 分析
- 扩展应用
- 7.1 二进制转十进制方法
- 手动计算方法
- 使用C++标准库函数
- 输出结果
- 扩展应用
- 7.2 十六进制转十进制方法
- 手动计算方法
- 使用C++标准库函数
- 输出结果
- 扩展应用
- 7.3 二进制与十六进制加法运算
- 示例计算
- 使用C++实现
- 输出结果
- 扩展应用
- 8.1 布尔代数基本规则
- 8.2 选项 D 的化简过程
- 问题描述
- 化简过程
- 示例代码
- 输出结果
- 分析
1. 循环结构与等差数列求和
1.1 逐天累加实现方法
逐天累加是一种常见的循环结构应用,用于计算累计值。在C++中,可以通过for
循环或while
循环实现。例如,计算每天阅读的页数,直到总页数超过或等于n
,代码如下:
int total_pages = 0;
int daily_pages = 1; // 每天阅读的页数
int n = 100; // 目标总页数while (total_pages < n) {total_pages += daily_pages;daily_pages++; // 每天阅读的页数递增
}
这种方法简单直观,但效率较低,尤其是当n
较大时,循环次数会很多。
1.2 等差数列求和公式优化
等差数列求和公式可以显著优化逐天累加的过程。等差数列的求和公式为:
[
S_n = \frac{n}{2} \times (a_1 + a_n)
]
其中,n
是项数,a_1
是首项,a_n
是末项。对于逐天累加问题,首项a_1
为1,末项a_n
为n
,项数n
可以通过公式求解:
[
n = \sqrt{2 \times \text{总页数}}
]
然后使用求和公式计算总页数,代码如下:
#include <cmath>
int total_pages = 100; // 目标总页数
int n = static_cast<int>(std::sqrt(2 * total_pages)); // 项数
int sum = n * (n + 1) / 2; // 等差数列求和公式if (sum < total_pages) {n++;sum = n * (n + 1) / 2;
}
这种方法通过数学公式减少了循环次数,提高了计算效率。# 2. 字符串操作与前导零处理
2.1 数字转字符串方法
在C++中,将数字转换为字符串有多种方法,每种方法都有其适用场景和优缺点。
-
使用
std::to_string
函数:这是最简单直接的方法,适用于所有基本数据类型(如int
、double
等)。例如:int num = 123; std::string str = std::to_string(num);
这种方法简单易用,但可能会引入不必要的字符(如浮点数的尾部零),需要额外处理。
-
使用
std::ostringstream
:这种方法更灵活,可以处理复杂的格式化需求。例如:std::ostringstream oss; oss << 123; std::string str = oss.str();
这种方法可以方便地将多个不同类型的数据拼接成字符串,但性能略逊于
std::to_string
。 -
使用
sprintf
函数:这是一种C语言风格的函数,可以将格式化的数据写入字符数组。例如:char buffer[10]; sprintf(buffer, "%d", 123); std::string str(buffer);
这种方法性能较高,但需要手动管理缓冲区大小,容易出错。
2.2 首尾字符交换实现
交换字符串的首尾字符是字符串操作中的一个常见需求,可以通过以下步骤实现:
- 获取字符串的首尾字符:通过索引访问字符串的第一个字符和最后一个字符。
- 交换字符:使用临时变量或直接交换字符。
- 更新字符串:将交换后的字符重新赋值给字符串。
示例代码如下:
std::string str = "hello";
if (str.length() > 1) {char temp = str[0];str[0] = str[str.length() - 1];str[str.length() - 1] = temp;
}
这种方法简单直观,但需要注意字符串长度小于2的情况,避免访问无效内存。
2.3 去除前导零技巧
去除字符串中的前导零是一个常见的字符串处理问题,可以通过以下方法实现:
-
使用
std::string::find_first_not_of
方法:找到第一个非零字符的位置,然后截取字符串。例如:std::string str = "00123"; size_t pos = str.find_first_not_of('0'); if (pos != std::string::npos) {str = str.substr(pos); } else {str = "0"; // 如果全是零,返回"0" }
这种方法简洁高效,适用于大多数情况。
-
手动遍历字符串:逐个检查字符,直到找到第一个非零字符,然后截取字符串。例如:
std::string str = "00123"; size_t pos = 0; while (pos < str.length() && str[pos] == '0') {pos++; } if (pos == str.length()) {str = "0"; // 如果全是零,返回"0" } else {str = str.substr(pos); }
这种方法虽然稍显繁琐,但可以更好地控制处理过程。
-
使用
std::stringstream
:将字符串转换为数字,再转换回字符串,自动去除前导零。例如:std::string str = "00123"; std::stringstream ss; ss << std::stoi(