C语言如何输出给定正整数的最小和最大真因数?
实现思路
你之前拼接因数取数位的方案存在逻辑缺陷,无需采用这种方式,直接在遍历查找真因数的过程中同步记录最小、最大真因数即可:
- 最小真因数就是你从小到大遍历时第一个匹配到的真因数
- 最大真因数就是遍历过程中最后一个匹配到的真因数,也可以通过
n / 最小真因数直接计算得到 - 同时你原来的代码做了两次无意义的全量遍历,可合并为一次遍历完成所有逻辑,提升执行效率
修改后的完整代码
#include <stdio.h> int main() { int n, divisor, smallest, biggest, count = 0; scanf("%d", &n); // 初始化边界值 smallest = n; biggest = 1; // 单次遍历完成真因数查找、最小/最大值记录、计数 for (divisor = 2; divisor < n; divisor++) { if (n % divisor == 0) { printf("%d is divisor of %d\n", divisor, n); count++; // 更新最小真因数 if (divisor < smallest) { smallest = divisor; } // 更新最大真因数 if (divisor > biggest) { biggest = divisor; } } } if (count == 0) { printf("The number does not have proper divisors(it is prime)\n"); } else { printf("Smallest proper divisor: %d\n", smallest); printf("Biggest proper divisor: %d\n", biggest); } return 0; }
代码说明
- 初始给
smallest赋值为n(所有真因数都小于n,只要找到匹配的因数就会更新这个值),给biggest赋值为1(所有真因数都大于1,只要找到匹配的因数就会更新这个值) - 合并两次遍历为一次,在找到真因数时同步更新计数、最小/最大真因数三个变量
- 最终通过计数判断是否为质数,如果存在真因数直接输出已经记录好的最小、最大真因数即可
内容的提问来源于stack exchange,提问作者plaguedoctor24
相关产品推荐
相关产品推荐

