CSP-J竞赛题里的枚举因数,用C++ vector怎么优雅实现?(附完整代码解析)
CSP-J竞赛题中的因数枚举用C vector实现的高效解法因数枚举是算法竞赛中的基础题型也是检验选手基本功的常见考点。在CSP-J/S这类面向青少年的信息学竞赛中如何用简洁高效的代码实现因数枚举往往决定了选手能否在时间限制内完成题目。本文将从一个典型的CSP-J竞赛题入手深入剖析如何利用C STL中的vector容器写出既优雅又高效的因数枚举代码。1. 理解题目与基础解法我们先来看题目要求给定一个正整数n从小到大打印它的所有正因数。例如当n12时输出应为1 2 3 4 6 12。最直观的解法是暴力枚举for(int i1; in; i) { if(n%i 0) cout i ; }这种方法虽然简单直接但时间复杂度为O(n)当n较大时比如1e9效率会非常低下。我们需要寻找更优的解法。2. 优化思路与数学原理因数的数学特性为我们提供了优化空间。对于任意正整数n如果i是n的因数那么n/i也必定是n的因数。这意味着我们只需要检查1到√n的范围就能找到所有因数。具体步骤如下遍历1到√n的整数i如果i是n的因数将i和n/i都记录下来注意处理i*in的特殊情况避免重复记录这种优化将时间复杂度降到了O(√n)效率提升显著。3. vector容器的优势与应用在实现这个优化算法时C的vector容器提供了几个关键优势动态扩容vector可以自动调整大小适应未知数量的因数预分配内存通过reserve()可以预先分配足够空间避免频繁扩容随机访问支持通过索引快速访问元素便于后续排序和输出下面是使用vector的基本框架vectorint fac; // 存储因数的容器 fac.reserve((int)ceil(sqrt(n))); // 预分配空间4. 完整实现与代码解析结合上述思路我们来看完整的实现代码#include bits/stdc.h using namespace std; int main() { int n; cin n; vectorint fac; fac.reserve((int)ceil(sqrt(n))); // 预分配空间 // 收集小于sqrt(n)的因数 int i; for(i1; i*in; i) { if(n%i 0) { fac.push_back(i); } } // 输出前半部分因数 for(int k0; kfac.size(); k) { cout fac[k] ; } // 处理i*in的特殊情况 if(i*i n) { cout i ; } // 输出后半部分因数对应的大因数 for(int kfac.size()-1; k0; --k) { cout n/fac[k] ; } return 0; }这段代码的几个关键点预分配空间通过ceil(sqrt(n))计算预分配大小避免频繁扩容分阶段收集因数先收集小于√n的因数再通过计算得到对应的大因数特殊处理完全平方数当n是完全平方数时中间的因数只需输出一次5. 性能分析与优化技巧让我们分析这个实现的性能优势方法时间复杂度空间复杂度代码复杂度暴力枚举O(n)O(1)简单优化算法O(√n)O(√n)中等进一步优化建议精确预分配空间对于大数n可以更精确地估计因数数量避免浮点运算用整数运算替代ceil(sqrt(n))的计算并行处理对于极大数可以考虑分块并行处理提示在竞赛中简单的整数运算通常比浮点运算更快更可靠。可以用while(i*i n)这样的条件来避免sqrt计算。6. 常见错误与调试技巧初学者在实现这个算法时容易犯的几个错误边界条件处理不当特别是当n为完全平方数时预分配空间不足导致vector频繁扩容输出顺序错误没有保持从小到大的顺序调试时可以添加一些中间输出// 调试输出 cout Collected factors: ; for(auto x:fac) cout x ; cout endl;7. 实际竞赛中的应用扩展这个算法可以扩展解决许多相关问题因数个数统计稍加修改即可计算因数数量质因数分解结合质数判断算法完美数判断因数和与原数的关系例如计算因数个数的实现int countFactors(int n) { int count 0; for(int i1; i*in; i) { if(n%i 0) { count (i*i n) ? 1 : 2; } } return count; }8. 对比其他语言实现为了更好理解vector的优势我们看看其他语言的实现方式Python实现使用列表def print_factors(n): fac [] for i in range(1, int(n**0.5)1): if n % i 0: fac.append(i) for f in fac: print(f, end ) if int(n**0.5)**2 n: print(int(n**0.5), end ) for f in reversed(fac): print(n//f, end )Java实现使用ArrayListimport java.util.ArrayList; public class Main { public static void main(String[] args) { int n 12; ArrayListInteger fac new ArrayList(); for(int i1; i*in; i) { if(n%i 0) fac.add(i); } for(int f : fac) System.out.print(f ); if(Math.sqrt(n) (int)Math.sqrt(n)) System.out.print((int)Math.sqrt(n) ); for(int ifac.size()-1; i0; i--) System.out.print(n/fac.get(i) ); } }相比之下C的vector在性能和内存控制上更有优势特别是在处理大规模数据时。9. 进阶技巧与最佳实践对于希望进一步提升的选手可以考虑以下进阶技巧模板化实现将算法封装为模板函数适用于各种整数类型迭代器使用用迭代器替代索引访问提高代码通用性内存池技术对于极端性能要求的场景可以自定义分配器模板化实现的示例templatetypename T void print_factors(T n) { vectorT fac; fac.reserve(static_castsize_t(ceil(sqrt(n)))); T i; for(i1; i*in; i) { if(n%i 0) fac.push_back(i); } for(auto f:fac) cout f ; if(i*i n) cout i ; for(auto itfac.rbegin(); it!fac.rend(); it) cout n/(*it) ; }10. 实战练习与测试用例为了巩固理解建议尝试以下练习修改程序使其只输出质因数计算并输出因数的和找出两个数的最大公约数测试用例示例输入预期输出11121 2 3 4 6 12161 2 4 8 16171 171001 2 4 5 10 20 25 50 100在竞赛准备中我经常使用这个算法作为基础构建更复杂的数学相关解决方案。一个实用的建议是将这类基础算法封装成可重用的函数这样在比赛时可以快速调用节省宝贵的时间。

相关新闻

Claude「断电」背后:中国基准首次捅开了AI万亿市场「死穴」

Claude「断电」背后:中国基准首次捅开了AI万亿市场「死穴」

6月22日Claude全家桶集体宕机,只是冰山一角。当最强大模型被丢进真实机房直面「幽灵故障」,AISHPerf-智算运维智能体评测基准给出残酷答案:全军覆没,无一过50分。这道鸿沟,第一次被量化。6月22日,全球AI圈突…

2026/7/1 6:58:14阅读更多 →
文献综述写作不用埋头翻资料!paperxie 四段式生成工具,按页面指引产出规范学术文稿

文献综述写作不用埋头翻资料!paperxie 四段式生成工具,按页面指引产出规范学术文稿

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/课程论文 文献综述 - PaperXie智能写作PaperXieAi论文智能生成软件,10分钟生成万字毕业论文、期刊论文、文献综述、PPT,Aigc查重、降重报告、文献资料。只需一个标题,从…

2026/7/1 6:53:13阅读更多 →
快速上手 Pinia!Vue3 极简状态管理使用教程

快速上手 Pinia!Vue3 极简状态管理使用教程

🔥 以龙息淬炼代码,在时光灰烬中重铸技术星河 ! 欢迎来到 晷龙烬的博客小窝✨! 这里记录技术学习点滴,分享实用技巧,偶尔聊聊奇思妙想~ 原创内容✍️,转载请注明出处~感谢…

2026/7/1 6:53:13阅读更多 →
粉笔公考课程能否冲刺高分?真实测评

粉笔公考课程能否冲刺高分?真实测评

公务员考试这条路,说真的,谁没在网上刷到过"980元上岸"的广告?一边是市面上动辄上万的线下班让人望而却步,一边又担心便宜没好货。我也纠结过:粉笔这个980系统班,真的能撑起整个备考周期吗&#…

2026/7/1 8:03:17阅读更多 →
从Turbo编码到环形缓冲:手把手拆解LTE HARQ中RV(冗余版本)的生成与选择逻辑

从Turbo编码到环形缓冲:手把手拆解LTE HARQ中RV(冗余版本)的生成与选择逻辑

从Turbo编码到环形缓冲:手把手拆解LTE HARQ中RV(冗余版本)的生成与选择逻辑在无线通信系统的演进中,混合自动重传请求(HARQ)技术始终扮演着关键角色。作为LTE物理层与MAC层交互的核心机制,HARQ通…

2026/7/1 8:03:17阅读更多 →
SQL注入攻防实战:从sqli-labs靶场到手工注入全解析

SQL注入攻防实战:从sqli-labs靶场到手工注入全解析

1. 项目概述:从靶场到实战的SQL注入攻防演练最近在带新人做安全渗透测试的入门训练,发现很多朋友对SQL注入的理解还停留在“‘ or 11 --”这种基础Payload的阶段。实际上,一个合格的渗透测试工程师需要掌握的远不止这些。我经常推荐他们从sql…

2026/7/1 8:03:17阅读更多 →
VLLMService Operator 开发第七篇:设计 gatewayRef 并梳理 HTTPRoute 调谐流程

VLLMService Operator 开发第七篇:设计 gatewayRef 并梳理 HTTPRoute 调谐流程

前言上一篇文章中,给 VLLMService Operator 增加了 Service 自动创建能力。到这个阶段,用户只需要创建一个 VLLMService,Operator 就可以自动创建 Deployment、Pod 和 Service,模型服务已经有了一个稳定的集群内访问入口。不过 Se…

2026/7/1 8:03:17阅读更多 →
别再死记硬背了!用‘平行四边形’视角,5分钟彻底搞懂二重积分换元里的雅可比行列式

别再死记硬背了!用‘平行四边形’视角,5分钟彻底搞懂二重积分换元里的雅可比行列式

用几何直觉破解雅可比行列式:当二重积分遇上平行四边形魔法想象你手里拿着一张世界地图,试图计算格陵兰岛的实际面积。墨卡托投影地图上,靠近两极的区域被严重拉伸——这种变形正是雅可比行列式在现实中的生动体现。当我们进行二重积分换元时…

2026/7/1 8:03:17阅读更多 →
从钢管运输到物流优化:一个20年前的数学建模题,如何启发今天的供应链算法设计?

从钢管运输到物流优化:一个20年前的数学建模题,如何启发今天的供应链算法设计?

从钢管运输到物流优化:经典数学建模如何重塑现代供应链算法二十年前那道关于钢管运输的数学建模题,在今天看来像是一颗埋藏已久的算法种子——当我们将视线从单一的管道铺设转向更广阔的物流网络时,会发现这个经典案例中蕴含的模型思想&#…

2026/7/1 7:58:17阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/7/1 4:42:14阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/7/1 5:19:01阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/1 0:01:44阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/1 0:01:44阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/1 0:01:44阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/1 0:01:44阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/1 0:01:44阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/1 0:01:44阅读更多 →