【GESP 一级】洛谷 B3953 找因数 题解
一、题目概述本题是GESP 2024 年 3 月一级认证真题对应洛谷题号 B3953是入门阶段的经典数论基础题核心是找出一个数的所有因数并按从小到大的顺序输出。题目可以简化为输入一个正整数aa ≤ 1000按从小到大的顺序逐行输出它的所有因数。样例输入6 → 输出1、2、3、66 的所有因数二、核心考察点GESP 一级官方考点这道题覆盖了 GESP 一级的多个核心考点同时引入了基础数论概念表格考点考察内容难度基础输入输出读取一个整数并逐行输出结果⭐循环结构使用for循环遍历可能的因数⭐⭐取模运算与整除判断利用%运算符判断一个数是否能被整除⭐⭐数论基础理解因数约数的概念即能整除原数的正整数⭐⭐三、解题思路分析1. 核心逻辑拆解因数的定义是如果一个正整数a能被另一个正整数b整除即a % b 0那么b就是a的因数。所以解题的核心思路就是遍历从1到a的所有整数i对于每个i判断a % i 0是否成立如果成立说明i是a的因数输出i。因为我们是从1开始从小到大遍历的所以输出的因数天然就是升序排列的无需额外排序。2. 优化思路进阶对于本题a ≤ 1000的规模直接遍历1~a完全没问题但可以进一步优化效率因数是成对出现的比如6的因数1和6、2和3所以只需遍历到sqrt(a)即可再把成对的因数加进去。不过对于一级考试来说直接遍历1~a的写法更简单直观完全满足题目要求。四、完整解题流程读取输入的正整数a使用for循环让i从1开始一直循环到a在循环内判断a % i 0如果条件成立输出i并换行程序结束。五、易错点提醒考试避坑循环范围错误循环变量i必须从1开始而不是从0开始0做除数会报错且要包含a本身因为a一定是自己的因数。整除判断条件错误条件必须是a % i 0而不是i % a 0否则逻辑完全颠倒会导致结果错误。输出格式错误题目要求每个因数单独占一行不能多个因数输出在同一行否则会被判格式错误。边界值测试输入1因数只有1必须输出1输入质数如7因数只有1和7输入完全平方数如4因数有1、2、42只需要输出一次。六、完整 C 代码#include iostream using namespace std; int main() { int a; cin a; // 遍历1到a的所有数判断是否是因数 for (int i 1; i a; i) { if (a % i 0) { // 能整除说明i是因数逐行输出 cout i endl; } } return 0; }七、总结这道题的核心是理解因数的定义并利用循环 取模运算实现遍历判断是 GESP 一级中非常典型的基础数论题。通过这道题你不仅掌握了因数的判断方法还能举一反三比如判断一个数是不是质数只需判断它除了1和自身外有没有其他因数比如统计一个数的因数个数只需在找到因数时用计数器累加最后输出结果。这类循环 判断的题目是编程入门的基础也是后续学习更复杂算法的前提。