C++实现求数字因数:先打印因数总数再输出所有因数的问题
问题分析
现有代码的核心问题是遍历过程中边找因数边输出计数和单个因数,不符合输出规则中「先输出总个数,再输出全部因数」的要求,需要先把所有找到的因数存储下来,遍历结束后再按要求顺序输出。
两种调整方案
方案1:保留原有遍历逻辑(适合初学者理解)
#include<bits/stdc++.h> using namespace std; int main(){ int n; cin >> n; int count = 0; vector<int> factors; for(int i = 1; i <= n; i++){ if(n % i == 0){ count++; factors.push_back(i); } } // 按要求顺序输出 cout << count << endl; for(int i = 0; i < factors.size(); i++){ if(i > 0) cout << " "; cout << factors[i]; } cout << endl; return 0; }
方案2:优化遍历范围(运行效率更高,适合上限1e6的场景)
遍历范围缩小到sqrt(n),每次找到因数i的同时存入对应的n/i,最后排序即可,时间复杂度从O(n)降到O(√n):
#include<bits/stdc++.h> using namespace std; int main(){ int n; cin >> n; vector<int> factors; for(int i = 1; i * i <= n; i++){ if(n % i == 0){ factors.push_back(i); if(i != n / i){ factors.push_back(n / i); } } } sort(factors.begin(), factors.end()); // 按要求顺序输出 cout << factors.size() << endl; for(int i = 0; i < factors.size(); i++){ if(i > 0) cout << " "; cout << factors[i]; } cout << endl; return 0; }
调整说明
- 新增vector容器存储所有找到的因数,遍历过程中只做计数和存储,不输出
- 遍历结束后先输出因数总个数,再按顺序输出所有因数,符合输出规则要求
- 方案2做了效率优化,就算n取上限1e6也仅需要遍历1000次,运行速度远高于原写法
内容的提问来源于stack exchange,提问作者Hope
相关产品推荐
相关产品推荐

