C++计算区间内整数因数之和的完整实现与优化策略
## 📝 问题解析 这个题目要求计算从 **m** 到 **n** 每个整数的**所有因数之和**,并按要求输出结果。下面我会给出 **C++ 实现方案**,并解释关键点。 --- ### 🔧 方案一:基础做法(逐个计算因数) 这是最直观的方法:对每个数 `i`,遍历从 `1` 到 `i`,检查是否能整除。 ```cpp #include <iostream> using namespace std; // 计算单个数的因数之和(基础版) int sumOfDivisors(int x) { int sum = 0; for (int i = 1; i <= x; ++i) { if (x % i == 0) { sum += i; } } return sum; } int main() { int m, n; cin >> m >> n; for (int i = m; i <= n; ++i) { cout << "因数之和(" << i << ") = " << sumOfDivisors(i) << endl; } return 0; } ``` --- ### ⚡ 方案二:优化版(只需遍历到 sqrt(x)) 因数成对出现,所以只需检查到 `sqrt(x)`,性能大幅提升。 ```cpp #include <iostream> #include <cmath> using namespace std; // 优化版:利用对称性,只需遍历到 sqrt(x) int sumOfDivisorsOptimized(int x) { int sum = 0; int limit = (int)sqrt(x); for (int i = 1; i <= limit; ++i) { if (x % i == 0) { sum += i; if (i != x / i) { // 避免重复添加平方数因子(如 4 的因子 2) sum += x / i; } } } return sum; } int main() { int m, n; cout << "请输入 m 和 n(m ≤ n):"; cin >> m >> n; for (int i = m; i <= n; ++i) { cout << i << " 的因数之和 = " << sumOfDivisorsOptimized(i) << endl; } return 0; } ``` --- ### 📊 算法复杂度对比 | 方案 | 时间复杂度 | 适用场景 | |------|------------|----------| | 基础版 | O(n × x) | 数值小,简单易懂 | | 优化版 | O(n × √x) | 通用,推荐使用 | --- ### 🚨 注意事项与边界处理 1. **输入验证**:确保 `m ≤ n`,否则输出错误提示。 2. **耗时优化**:如果 `n - m` 很大(如百万级),可以考虑使用 **前缀和** 或 **筛法**,但一般情况下 √n 优化已足够。 3. **整数溢出**:若数字较大(如 10^9),因数之和可能超出 `int` 范围,建议改用 `long long`。 4. **平方数特殊情况**:因子 `sqrt(x)` 只能加一次,必须判断是否相等。 --- ### 💡 进阶建议 如果需要进一步优化,可以**预处理素数表**,快速分解质因数,然后用公式计算因数之和: > 若 `x = p1^a1 * p2^a2 * ... * pk^ak`,则因数之和 = `(p1^(a1+1)-1)/(p1-1) * ...` 这样复杂度可降至 **O(log x)**,适合大规模计算。 --- ### 📚 测试样例 **输入**:`m = 1, n = 10` **输出示例**: ``` 1 的因数之和 = 1 2 的因数之和 = 3 3 的因数之和 = 4 4 的因数之和 = 7 5 的因数之和 = 6 6 的因数之和 = 12 7 的因数之和 = 8 8 的因数之和 = 15 9 的因数之和 = 13 10 的因数之和 = 18 ``` --- ### ✅ - **首选优化版**,代码清晰且高效。 - 注意使用 `long long` 防止溢出。 - 如果需在竞赛中使用,推荐结合素数筛 + 公式法。 ######[AI写代码神器 | 967点数解答 | 2026-08-23 17:41:31]
- 判断超级幸运数:满足“纯4/7数位”或“4/7总个数为4或7”的整数计数(阿里通义 | 965点数解答 | 2026-03-13 12:15:06)159
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)566
- 巧用筛法!计算 N 到 M 间数的最大质因数个数(DeepSeek | 245点数解答 | 2026-01-18 12:43:51)100
- C++ 实现我的世界基岩版:从简单框架到开发要点揭秘(字节豆包 | 182点数解答 | 2025-02-22 15:53:11)294
- C++ 实现完整斗地主:含洗牌、发牌与手牌展示,可按需扩展!(字节豆包 | 1028点数解答 | 2026-01-10 08:02:37)137
- C 语言:按特定顺序读入并输出浮点数、整数和字符(字节豆包 | 106点数解答 | 2024-09-26 00:32:40)421
- C语言:按序读入浮点数、整数、字符并按新顺序输出,附代码实现 (字节豆包 | 108点数解答 | 2024-09-30 22:54:08)434
- C语言:按特定顺序读入并输出浮点数、整数和字符,精确控制小数位(字节豆包 | 155点数解答 | 2024-10-08 22:06:18)425
- C++与Python:按特定顺序输入输出数据并保留浮点数两位小数的实现(字节豆包 | 168点数解答 | 2024-10-08 22:07:03)424
- C语言:按特定顺序读入再输出,含浮点数精确格式处理(字节豆包 | 105点数解答 | 2024-10-08 22:07:29)440
- C++ 混合类型数据格式化输入输出:按指定顺序输出并保留两位小数(字节豆包 | 187点数解答 | 2024-10-16 14:31:08)479
- C语言:实现混合类型数据格式化输入输出,代码超简单!(字节豆包 | 159点数解答 | 2024-10-16 14:32:18)471