整数因数生成器开发遇阻:vector.size()重复输出问题求助
问题分析与修复方案
问题根源
- 初始化
numbersOfN时错误指定了容量:std::vector<int> numbersOfN(n);会直接创建包含n个默认值为0的元素的容器,后续push_back是在这些0后面追加1~n,导致容器里既有多余的0,又有目标数字。 - 内层遍历输出逻辑嵌套在外层循环里,每次添加一个元素就遍历输出所有已有元素,自然会出现重复输出的情况。
n = numbersOfN.size();这步完全多余,因为初始化后numbersOfN的大小本来就是n,赋值后没有变化。
修复方案(按你的初始思路实现)
如果坚持先把1~num存入容器再筛选因数,修改后的代码如下:
#include <iostream> #include <vector> void getFactors(int num) { std::vector<int> numbersOfN; // 批量存入1到num的整数 for (int nofn = 1; nofn <= num; nofn++) { numbersOfN.push_back(nofn); } // 验证存入的内容(后续可替换为筛选逻辑) std::cout << "存入的数字:"; for (int num : numbersOfN) { std::cout << num << " "; } std::cout << std::endl; // 筛选因数的逻辑 std::vector<int> factorsOfN; for (int candidate : numbersOfN) { if (num % candidate == 0) { factorsOfN.push_back(candidate); } } std::cout << num << "的因数:"; for (int factor : factorsOfN) { std::cout << factor << " "; } } int main() { int num = 32; getFactors(num); }
修改说明
- 去掉vector初始化时的容量参数,避免生成多余的0元素。
- 把遍历输出的逻辑移到所有元素添加完成后,避免重复输出。
- 补充了筛选因数的核心逻辑,直接完成你的需求。
更高效的替代方案(无需存储所有数字)
其实生成因数不需要先存1~num的所有数,直接遍历到√num即可,同时收集对应的商,效率提升明显:
#include <iostream> #include <vector> #include <cmath> #include <algorithm> void getFactors(int num) { std::vector<int> factors; for (int i = 1; i <= sqrt(num); i++) { if (num % i == 0) { factors.push_back(i); // 避免平方数(如16)重复添加因数 if (i != num / i) { factors.push_back(num / i); } } } // 对因数排序(可选) std::sort(factors.begin(), factors.end()); std::cout << num << "的因数:"; for (int factor : factors) { std::cout << factor << " "; } } int main() { int num = 32; getFactors(num); }
方案优势
- 时间复杂度从O(n)降到O(√n),处理大数时速度快很多。
- 不需要额外存储1~num的所有数字,节省内存空间。
内容的提问来源于stack exchange,提问作者bananass4life
相关产品推荐
相关产品推荐

