Онлайн компилятор C

#include <stdio.h> int main() { int a, b; // 读入范围的起点 a 和终点 b if (scanf("%d %d", &a, &b) != 2) { return 0; } int first = 1; // 用于控制输出格式,确保数字之间有空格,末尾无多余空格 // 外层循环:遍历从 a 到 b 的每一个整数 for (int i = a; i <= b; i++) { int count = 0; // 用于统计当前数字 i 的因数个数,每次进入新数字时清零 // 内层循环:找出数字 i 的所有因数 for (int j = 1; j <= i; j++) { if (i % j == 0) { count++; // 如果能整除,说明 j 是 i 的因数,计数加 1 } } // 格式化打印:如果是第一个数字前不加空格,后续数字前加空格 if (!first) { printf(" "); } printf("%d", count); first = 0; // 输出完第一个数后,标记置为 0 } printf("\n"); // 最后规范换行 return 0; }
这段代码的功能是:读入两个整数 a 和 b,然后对于从 a 到 b 的每一个整数,计算它有多少个因数(包括 1 和它本身),并将这些因数个数依次输出,数字之间用空格分隔。

代码的逻辑是正确的,但有一个潜在的性能问题需要注意。

- 内层循环从 1 遍历到 i,对于较大的 i(例如接近 10000 或更大),计算量会很大。你可以思考如何减少循环次数,比如只遍历到 i 的平方根,并利用对称性来统计因数个数。
- 注意变量 first 的用法:它用来控制第一个数字前不加空格,后续数字前加空格。这个思路是正确的,但你可以检查一下当 a 大于 b 时,循环不会执行,此时 first 仍为 1,但程序会直接输出换行,行为是合理的。