C++奇偶判断与不同数学运算的实现解析
好的,我们先来分析一下题目要求,然后用 C++ 分步实现。 ### 🎯 题目分析 1. **输入**:一个正整数 `n`。 2. **判断奇偶性**: * 如果 `n` 是奇数,计算从 `1` 到 `n * n` 之间所有**偶数**的和。 * 如果 `n` 是偶数,计算 `n` 的所有**约数(包括 1 和 n 本身)** 的和。 ### 📦 准备工作 这是一个控制台程序,只需要一个支持 C++ 标准(如 C++11 或更高)的编译器即可,例如 `g++`、`clang++` 或 Visual Studio 的 MSVC。 ### 🧠 算法思路与实现 我们将分模块来实现这个逻辑。 #### 1️⃣ 判断奇偶性 使用取模运算符 `%`。如果 `n % 2 == 1`,则为奇数;否则为偶数。 #### 2️⃣ 奇数情况:求 1 ~ n² 的偶数和 * **范围**:从 `1` 到 `n * n`。 * **目标数**:所有偶数。 * **高效求法**:这是一个等差数列。该范围内的偶数序列是 `2, 4, 6, ...`,最大不超过 `n*n`。 * 项数 `count = (n * n) / 2`。 * 首项 `first = 2`,末项 `last = (n * n) % 2 == 0 ? n * n : n * n - 1`。 * 等差数列求和公式:`和 = (首项 + 末项) * 项数 / 2`。 * 也可以直接用循环累加,但公式法效率为 O(1)。 #### 3️⃣ 偶数情况:求约数之和 * **约数**:能够整除 `n` 的正整数。 * **求法**:遍历从 `1` 到 `sqrt(n)`。如果 `i` 能整除 `n`,则 `i` 和 `n / i` 都是约数,将它们相加。注意处理完全平方数的情况,避免同一个约数加两次。 ### 💻 代码实现 ```cpp #include <iostream> #include <cmath> // 用于 sqrt 函数 using namespace std; int main() { int n; long long sum = 0; // 使用 long long 防止大数溢出 // 1. 获取输入 cout << "请输入一个正整数 n: "; cin >> n; // 2. 输入验证(可选但推荐) if (n <= 0) { cout << "错误:请输入一个正整数。" << endl; return 1; // 非正常退出 } // 3. 判断奇偶并计算 if (n % 2 == 1) { // n 是奇数 long long nn = 1LL * n * n; // 1LL 确保使用 long long 类型计算,防止 int 溢出 // 方法1:使用等差数列公式(高效) long long last_even = (nn % 2 == 0) ? nn : nn - 1; // 找到不大于 n² 的最大偶数 long long count = nn / 2; // 1 到 n² 之间偶数的个数 sum = (2 + last_even) * count / 2; // 方法2:循环累加(直观但较慢,适用于理解) // sum = 0; // for (int i = 2; i <= nn; i += 2) { // sum += i; // } cout << "n 是奇数。计算 1 到 " << nn << " 之间所有偶数的和。" << endl; } else { // n 是偶数 cout << "n 是偶数。计算 " << n << " 的所有约数之和。" << endl; // 求约数之和 int root = sqrt(n); // 优化:只需遍历到平方根 for (int i = 1; i <= root; i++) { if (n % i == 0) { // i 是约数 sum += i; // 加上较小的约数 if (i != n / i) { // 避免当 i 等于 n/i 时(即 n 为完全平方数)重复相加 sum += n / i; // 加上配对的较大约数 } } } } // 4. 输出结果 cout << "结果为: " << sum << endl; return 0; } ``` ### 🔍 关键代码解释 * `1LL * n * n`:`1LL` 是 `long long` 类型的字面量。将计算提升到 `long long` 类型进行,防止两个 `int` 相乘可能导致的溢出(当 `n` 较大时)。 * **约数求和循环**: * `for (int i = 1; i <= root; i++)`:遍历所有可能的因子。 * `if (n % i == 0)`:判断 `i` 是否能整除 `n`。 * `sum += i;` 和 `sum += n / i;`:将一对约数加入总和。 * `if (i != n / i)`:这个判断至关重要。当 `n` 是像 4、9、16 这样的完全平方数时,`i` 和 `n/i` 是同一个数,如果不加判断就会把这个约数加两次。 ### ⚠️ 开发建议与注意事项 1. **输入验证**:程序开头对输入进行了基本验证,这是良好编程习惯,可以防止无效输入导致后续计算错误或崩溃。 2. **数据类型选择**:当 `n` 较大时,`n*n` 或约数之和可能超出 `int` 类型的范围(通常约 ±21亿)。使用 `long long` 类型来存储和计算结果是**必要的安全措施**。 3. **性能考量**: * **奇数路径**:使用等差数列公式,时间复杂度为 O(1),是最优解。 * **偶数路径**:求约数时遍历到 `sqrt(n)`,时间复杂度为 O(√n),比遍历到 `n` 的 O(n) 快得多。 4. **代码可读性**:添加清晰的注释和输出提示,方便他人理解和调试。 5. **扩展思考**:如果题目要求“1~n之间”而不是“1~nn之间”,只需修改循环上限或公式即可,注意审题。 ### 🧪 测试用例 | 输入 (n) | 类型 | 预期计算 | 结果 (示例) | | :--- | :--- | :--- | :--- | | 3 | 奇数 | 1 ~ 9 的偶数和 (2+4+6+8) | 20 | | 4 | 偶数 | 4的约数和 (1+2+4) | 7 | | 1 | 奇数 | 1 ~ 1 的偶数和 (无数) | 0 | | 6 | 偶数 | 6的约数和 (1+2+3+6) | 12 | | 10 | 偶数 | 10的约数和 (1+2+5+10) | 18 | ### 📚 学习资源 * **C++ 基础**:[C++ Primer](https://www.informit.com/store/c-plus-plus-primer-9780321714114) 或 [cplusplus.com](http://www.cplusplus.com/doc/tutorial/) * **算法入门**:《算法导论》或在线平台如 [LeetCode](https://leetcode.com/)、[牛客网](https://www.nowcoder.com/) ######[AI写代码神器 | 1766点数解答 | 2026-03-06 20:43:36]
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)335
- Golang开发:解析JSON数据时数值默认类型及示例解析(百度文心 | 393点数解答 | 2023-11-09 18:13:06)265
- SQL Working Areas Sizing: Manual vs. Automatic Policy - A Comprehensive Analysis(阿里通义 | 530点数解答 | 2024-05-13 10:55:58)294
- 深入解析格雷码生成算法:递归求解与代码实现(DeepSeek | 443点数解答 | 2026-01-05 12:21:49)43
- 深入探究:n 位格雷码中编号 k 二进制串的求解算法与实现(DeepSeek | 726点数解答 | 2026-01-13 12:31:37)42
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)304
- Java实现Student类:计算三门课程总分、平均分、最高分与最低分( | 2332点数解答 | 2024-03-12 10:23:27)256
- Python代码实现创建并写入成绩信息到 scores.txt 文件( | 342点数解答 | 2024-04-21 15:53:03)342
- Python实现:输入学生数量计算各科成绩平均分、标准差与中位数(讯飞星火 | 715点数解答 | 2024-05-08 11:20:09)329
- 上海海洋大学yqhyzy:Python实现学生各科成绩统计值计算,含随机生成与精准输出! ( | 1398点数解答 | 2024-05-08 11:21:34)329
- 上海海洋大学yqhyzy:输入学生数算语数外成绩平均分、标准差与中位数( | 699点数解答 | 2024-05-08 11:24:39)317
- 上海海洋大学yqhyzy:Python实现n个学生各科成绩生成与统计值计算(百度文心 | 683点数解答 | 2024-05-08 11:25:45)284