C++ 实现输出指定范围内非3倍数数字的因数
好的,我们一起来解决这个问题。 --- ## 🎯 题目理解 我们需要输出从 `a` 到 `b`(包含两端)范围内所有数字的因数,但有以下**特殊规则**: - 如果某个数字是 **3 的倍数**,则**跳过**该数字,不输出它的因数。 - 每个数字的因数按**升序**输出,在同一行内,用**空格**分隔。 - 每个数字的因数占一行。 例如输入 `10 15`: - 10不是3的倍数,输出其因数:`1 2 5 10` - 11不是3的倍数,输出:`1 11` - 12是3的倍数,跳过 - 13不是3的倍数,输出:`1 13` - 14不是3的倍数,输出:`1 2 7 14` - 15是3的倍数,跳过 --- ## 🧠 核心思路 1. **遍历**从 `a` 到 `b` 的每个整数 `i`。 2. 如果 `i % 3 == 0`,则**跳过**,继续下一个。 3. 否则,找出 `i` 的所有因数: - 一个数 `i` 的因数就是所有能整除 `i` 的数,即 `j` 从 `1` 到 `i`,若 `i % j == 0`,则 `j` 是因数。 - **优化**:因数成对出现,`j` 只遍历到 `sqrt(i)`,然后同时添加 `i / j`(注意去重和排序)。 4. 将因数按**升序**输出,并在每个数输出完毕后换行。 --- ## 💻 C++ 实现 ```cpp #include <iostream> #include <vector> #include <algorithm> #include <cmath> using namespace std; // 获取一个数的所有因数(升序) vector<int> getFactors(int n) { vector<int> factors; int limit = sqrt(n); for (int i = 1; i <= limit; ++i) { if (n % i == 0) { factors.push_back(i); if (i != n / i) { factors.push_back(n / i); } } } sort(factors.begin(), factors.end()); return factors; } int main() { int a, b; cin >> a >> b; for (int num = a; num <= b; ++num) { // 特殊规则:3的倍数跳过 if (num % 3 == 0) { continue; } vector<int> factors = getFactors(num); for (size_t i = 0; i < factors.size(); ++i) { if (i > 0) cout << " "; cout << factors[i]; } cout << endl; } return 0; } ``` --- ## 📌 代码说明 | 部分 | 解释 | |------|------| | `sqrt(n)` | 用于减少循环次数,提高效率 | | `factors.push_back(i)` | 添加一个小因数 | | `if (i != n / i)` | 防止平方数重复添加 | | `sort(factors.begin(), factors.end())` | 确保输出有序 | | `if (num % 3 == 0) continue` | 实现特殊规则 | --- ## ⏱ 时间与空间复杂度 - **时间复杂度**:O((b-a+1) × √b),对于 `b` 最大为 10^6 级别的场景依然较快。 - **空间复杂度**:O(√b),用于存储临时因数列表,每次输出后即释放。 --- ## 💡 开发建议 1. **输入验证**:确保 `a <= b`,并考虑 `a` 可能为负数或 0 的情况(题目要求正整数因数)。 2. **边界情况**:若 `a` 到 `b` 范围内所有数都是 3 的倍数,则输出为空,程序逻辑上仍需正确处理。 3. **性能优化**:如果多次查询,可先预处理因数表,但本题单次查询,无需过度优化。 4. **输出格式**:注意最后一行也要输出换行,避免出现格式错误。 5. **C++ 特性**:使用 `sqrt` 需要包含 `<cmath>`,使用 `vector` 和 `sort` 需包含相应头文件。 --- ## ❓ 常见问题 (FAQ) **Q1:如果 a 或 b 是负数怎么办?** A:题目未明确说明,但因数通常针对正整数。如果出现负数,可以取绝对值处理。 **Q2:如何避免因数重复输出?** A:使用 `if (i != n / i)` 判断,或者最后再 `unique`。 **Q3:为什么用 `sqrt` 优化?** A:因为因数成对出现,遍历到平方根即可找到所有因数,将复杂度从 O(n) 降到 O(√n)。 --- ######[AI写代码神器 | 1115点数解答 | 2026-07-24 21:20:11]
- Python 实现字母与 ASCII 码的灵活转换程序(字节豆包 | 295点数解答 | 2025-11-02 16:58:48)144
- C++ 实现:精准统计给定范围 [L, R] 内数字 2 出现的次数及代码详解(字节豆包 | 401点数解答 | 2026-02-05 21:17:05)136
- C++实现:统计[L, R]范围内数字2出现的次数及代码详解(字节豆包 | 489点数解答 | 2026-02-07 17:12:26)151
- 巧用筛法!计算 N 到 M 间数的最大质因数个数(DeepSeek | 245点数解答 | 2026-01-18 12:43:51)85
- C++ 判断正整数倍数:模运算、输出格式与边界处理(DeepSeek | 1916点数解答 | 2026-05-22 20:38:46)76
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)534
- Python实现数字是否为3的倍数判断及输出(字节豆包 | 508点数解答 | 2026-05-31 14:10:46)77
- C++实现数字倍数判断及输出(字节豆包 | 741点数解答 | 2026-05-31 14:11:48)60
- 计算区间 n 到 m 中数字 x 出现次数的 Python 实现与详解(字节豆包 | 289点数解答 | 2025-12-07 17:14:59)174
- Python 实现:计算区间 n 到 m 中数字 x 出现的次数(字节豆包 | 322点数解答 | 2025-12-13 21:37:08)161
- Python:用正则表达式从含多种字符的字符串中提取英文、数字和中文单词(GPT | 522点数解答 | 2024-05-31 19:05:27)393
- Python:用正则表达式结合 split 思路提取一行字符串中的英文、数字和中文单词 (GPT | 399点数解答 | 2024-05-31 19:07:31)401