C语言循环23题实战详解:从哨兵值到完数筛选

发布时间:2026/10/24 14:39:44

C语言循环23题实战详解:从哨兵值到完数筛选 简介针对C语言初学者与高校编程课程备考生这份23道循环练习题以docx文档呈现系统覆盖for、while循环及素数判断、水仙花数、数列求和、最大公约数等经典场景并延伸至斐波那契判断、数位之和、数根、平均成绩等进阶应用。每道题均给出题目描述、输入输出格式、样例与扩展测试用例可帮助读者理解循环边界、累加累乘、嵌套控制等关键思维尤其适合应对计算机二级、专升本机试及日常算法入门训练。资源包共1个文件类型为Word文档压缩包约3.85MB内容可直接编辑打印便于教师组卷或学生反复练习题目按难度递进从最大数、奇偶判断到数位处理与征税计算由浅入深覆盖循环结构的主要考点附带的测试输入输出样例有助于自我检验、减少基础语法错误。文档内题干规范、排版清晰还能快速定位循环条件与边界等关键信息。目前已有4248人学习下载是快速巩固循环结构、提升编程逻辑的实用材料。1. 一批能让你真正练熟 C 语言循环的 23 道题从 do-while 读 0 结束到完数筛选很多初学者学 C 语言循环卡在同一个地方书上的语法看懂了一到自己写就不知道用 for 还是 while更不知道循环体里什么时候更新变量、什么时候跳出。这份 C 语言循环练习题共 23 题恰好把循环结构里最常见的场景都覆盖了——读 0 结束、遇负数终止、repeat 重复执行、数的拆分、累加累乘、素数判断、最大公约数、数根、完数筛选。它不是一个教学课件更像是一叠可以直接上手敲的题卡每道题都带输入样例、输出样例部分还给了测试输入输出。适合刚学完 for 和 while 语法、想找题目练手的人也适合带学生做课后训练的人用来当题库。我实际把这 23 道题刷了一遍其中几道题的“坑”相当典型——比如第 4 题西瓜卖几天很多人会栽在奇数个西瓜的“卖一半”上第 21 题计数最大值初始化选错直接导致答案错。接下来按我的拆解方式把这 23 题的使用方法、代码骨架和踩坑记录整理出来。2. 先看懂 23 题的内部结构按循环模式分类选题才不会盲目拿到这 23 题第一件事不是急着写代码而是把它们按“循环怎么进、怎么出、循环体里干什么”分类。我刷完后把它们分成四类每类对应的循环选型和变量维护方式完全不同。2.1 哨兵值结束型读 0 结束、遇负数终止、EOF 结束第 1 题最大数、第 9 题奇数和、第 10 题求和、第 21 题计数都属于这一类。它们的共同点是不知道循环多少次只知道某个特定值出现时循环结束。这个特定值在编程里叫哨兵值sentinel。这类题我统一用 while 循环因为进入循环前就要读一次数据循环体内根据读到的值决定是否继续。看第 9 题奇数和的标准写法#include stdio.h int main() { int num, sum 0; scanf(%d, num); while (num ! 0) { if (num % 2 ! 0) { sum num; } scanf(%d, num); } printf(%d\n, sum); return 0; }逻辑说明先读第一个数进入循环时判断它是不是 0。循环体内先处理当前数再读下一个数到 num。这样一来循环体末尾的 scanf 负责“更新条件变量”下一次循环开始时的 num ! 0 判断才会基于新的输入。如果把 scanf 放在循环体开头会漏处理第一个数这是最常见的基础错误。参数说明num 是当前读入的整数sum 是奇数累加和。第 10 题求和把条件改成 num 0 结束第 1 题最大数在循环体内加一个 if (num max) max num; 即可。这里有个需要特别提醒的点循环体末尾的 scanf 绝不能漏。我见过不少学生写成 while 循环里只有处理逻辑没有重新读入结果死循环。调试时第一反应就是检查“循环条件依赖的变量有没有在循环体内被更新”。2.2 计数型循环明确知道循环次数用 for 最直接第 3 题、第 6 题、第 13 题、第 15 题、第 16 题、第 19 题、第 20 题都属于明确知道要循环多少次的。比如第 6 题计算 1 1/2 ... 1/nn 是输入的正整数循环 n 次即可。这类题统一用 for 循环。for 的三段式结构天然把“初始化、条件、更新”放在一行代码可读性最高。看第 3 题的实现#include stdio.h int main() { int n, i; double sum 0.0; scanf(%d, n); for (i 1; i n; i) { sum 1.0 / (3 * i - 2); } printf(%.5f\n, sum); return 0; }逻辑说明第 i 项的分母是 3*i-2所以循环变量 i 直接从 1 开始每轮计算一项并累加。注意 1.0 / (3 * i - 2) 这里的 1.0 是浮点字面量如果写成 1 / (3 * i - 2)在 C 语言里两个整数相除结果还是整数——第 i 项全部是 0这是整数除法陷阱的经典案例。参数说明%.5f 控制输出保留 5 位小数题目要求的输出格式是 1.56978 这样的 5 位小数。如果把循环变量 i 改成从 0 开始分母就变成了 3*i1一样能算但可读性差一些。第 16 题强调一点它除了循环次数已知还要求“第一个数为 N后面接着 N 个数”。这意味着先读 N再循环 N 次读后续数据循环次数就是 N。注意它要求输出奇数的平方和与偶数的立方和需要定义两个累加变量初始化为 0千万不能混淆。2.3 条件递推型循环次数不固定但依赖上一轮的结果第 4 题西瓜卖几天、第 18 题数根属于这一类。它们的特点是循环体执行一次问题的规模或状态发生变化直到满足结束条件。第 4 题西瓜卖几天是最容易写错的一道。题目描述n 个西瓜第一天卖一半多两个以后每天卖剩下的一半多两个问几天卖完。奇数个西瓜时“卖一半”为一半的整数——比如 5 个西瓜卖 2 个。这意味着本题不能用浮点数直接除以 2必须用整数除法。看实现#include stdio.h int main() { int n, days 0; scanf(%d, n); while (n 0) { int sold n / 2 2; n n - sold; days; } printf(%d\n, days); return 0; }逻辑说明关键在 int sold n / 2 2C 语言里整数 n / 2 自动向下取整——5 / 2 得到 2正好对应题目的“卖一半为卖 2 个”。循环条件是 n 0每卖一次天数加 1直到西瓜数不大于 0。这个例子如果你用 double 保存 n5 / 2 变成 2.5就会算错。参数说明days 是卖完需要的天数sold 是当天卖出的西瓜数。测试输入 120按这个逻辑计算结果是 5与题目给出的测试输出一致。第 18 题数根是另一种递推把一个正整数的各位数字相加如果结果不是一位数就继续相加。比如 8943894324246输出 6。这种“结果反馈到下一次计算”的模式用 while 循环最合适。2.4 枚举遍历型从某个范围里筛出满足条件的数第 7 题水仙花数、第 11 题特殊数值、第 22 题输出区间素数、第 23 题完数都属于枚举遍历型。它们的共同点是从某个范围比如 100 到 999、1000 到 9999、2 到 n逐个检查每个数是否满足条件。这类题用 for 枚举内层再做条件判断。但要注意枚举型的“判断条件”往往是独立的函数或一段较复杂的代码不适合全部塞进循环体否则一层套一层可读性极差。后面第 4 章我会专门拆这几道题和一些优化边界。3. 输入输出格式里的坑这 5 道题写对逻辑很容易写对格式很难23 题里有一批题算法逻辑本身不算难但输入输出格式非常讲究。我看到很多人在这些题上翻车不是不会写循环而是没理解题目对格式的约定。下面挑最有代表性的几道展开。3.1 repeat 模式先读重复次数再循环处理多组数据第 5 题成绩判定、第 20 题幂函数都是先输入一个正整数 repeat0 repeat 10然后做 repeat 次运算。这类题的标准结构是外层循环 repeat 次内层处理单次业务逻辑。看第 20 题幂函数的写法#include stdio.h int main() { int repeat, i; scanf(%d, repeat); for (i 0; i repeat; i) { double x; int n; scanf(%lf %d, x, n); double result 1.0; for (int j 0; j n; j) { result * x; } printf(%.0f\n, result); } return 0; }逻辑说明外层 for 控制 repeat 次处理内层 for 用连乘计算 x 的 n 次幂。注意内层循环变量声明为 int j 0 是 C99 标准支持的写法如果你的编译器较老需要把 j 的声明提到循环外。参数说明scanf(%lf %d, x, n) 中 %lf 是 double 的输入格式符float 才是 %f。很多人在这里写错导致 x 读取异常。pow 函数当然也能实现但题目显然在考察循环结构用连乘才是本题意图。第 5 题成绩判定在输出格式上有一个细节每次判断完成绩立即输出 Pass 或 Fail不需要额外加分隔符因为每个结果占一行。3.2 读入一批数据但不提前告诉数量靠特殊值或负数终止第 1 题最大数、第 9 题奇数和、第 10 题求和、第 21 题计数都有一个共同特点不知道输入有多少个数需要依靠某个特殊值或条件终止。这在实际开发里非常常见——比如从文件里读数据到 EOF。第 10 题求和的终止条件是“遇到负数则终止输入”。和读 0 结束不一样负数是不参与求和的。看实现#include stdio.h int main() { int num, sum 0; scanf(%d, num); while (num 0) { sum num; scanf(%d, num); } printf(%d\n, sum); return 0; }逻辑说明循环条件是 num 0所以一旦读入负数循环退出负数不会计入 sum。注意这里不能改成 while (num 0)因为正数输入可能包含 0——题目说的是“输入若干正数”但实际测试数据里 0 有可能出现用 更稳妥。参数说明sum 保存累加和。如果题目要求“输入若干正数对其求和并输出遇到负数则终止输入”那么 0 应被视为正数参与求和所以条件判断必须包含 0。我在实际带练的时候发现很多人把终止条件写成 if (num 0) break;然后循环体里继续累加。这样也能运行但用 while 条件判断作为终止条件语义更清晰——循环的入口条件本身就说明了“什么情况下继续”。3.3 数位拆分循环结合取余和整除第 8 题数位之和、第 17 题偶数位求和、第 18 题数根核心都是同一个操作把一个多位数拆成各个位上的数字。拆位的标准手法是反复 % 10 取个位再 / 10 去掉个位。看第 8 题的实现#include stdio.h int main() { int n, sum 0; scanf(%d, n); while (n 0) { sum n % 10; n n / 10; } printf(%d\n, sum); return 0; }逻辑说明n % 10 取出当前个位n / 10 去掉刚取出的个位。比如 n1234 时第一次循环取 4n 变 123第二次取 3n 变 12第三次取 2n 变 1第四次取 1n 变 0循环结束sum10。参数说明当输入 n0 时while (n 0) 不进入循环sum 保持 0输出 0——这在逻辑上是对的。但如果你用 do-while 结构n0 时会先执行一次循环体输出 0 也一致但 n0 和 n00 这种边界情况就要想清楚。第 17 题在取位后加一个 if (digit % 2 0) 判断即可。注意它的输入 4321 输出 624说明只累加偶数位的数字不考虑偶数位的位置——每个数字本身是偶数就累加。3.4 输出格式的差异空格分隔、换行分隔、行尾是否有空格第 22 题输出 [2,n] 之间所有的素数及素数个数输出样例是“2 3 5 7 4”——注意素数和个数之间有两个空格。第 23 题输出完数“6 28 496”用空格分隔。第 16 题输出“106 512”平方和与立方和以空格隔开。这些格式细节直接影响判题结果。我的习惯是先按题目的输出样例推断分隔符然后写代码时用一个计数器变量记录“当前是否已经输出过内容”第一个输出前面不加空格后续输出前加空格。比如输出完数的代码#include stdio.h int main() { int n, i, j, sum; int first 1; scanf(%d, n); for (i 2; i n; i) { sum 0; for (j 1; j i; j) { if (i % j 0) { sum j; } } if (sum i) { if (first) { printf(%d, i); first 0; } else { printf( %d, i); } } } printf(\n); return 0; }逻辑说明first 变量控制格式——第一个完数输出前不打印空格之后的完数打印一个空格再打印数字。这样可以确保 6 28 496 而不是 6 28 496前缀空格。参数说明外层循环从 2 开始是因为完数定义为“除自身外的因子之和等于它本身”1 的因子和是 0 不等于 1。内层循环 j i 穷举所有可能的因子整除时累加。这个写法的时间复杂度是 O(n²)n1000 时完全没问题但如果 n 到 100 万就需要用根号优化的写法了。3.5 题目示例与测试输入的偏差拿第 10 题说事第 10 题的输入样例是“32 33 50 34 65 67 -1”输出 281也就是 323350346567281。测试输入是“31 33 50 34 65 67 -5”输出 280。注意两道输入里中间都有空格不是换行——scanf 对空格和换行一视同仁用 %d 连续读即可。第 4 题西瓜卖几天输入 10 输出 210 个西瓜第一天卖 10/227剩 3第二天卖 3/223剩 0所以 2 天。这里 3/2 在 C 语言整数除法里等于 1加上 2 等于 3。如果用浮点数算3/21.523.5剩 -0.5天数反而可能变 3——这也是为什么必须用 int 的原因。4. 数学规律题和算法题水仙花、特殊数值、素数、公约数、数根的优化边界23 题里有一批需要数学推导或算法基础的题它们不仅考循环还考“怎么在循环里做判断”。我把这 8 道题放在一起讲因为它们有一个共同特征循环内嵌条件判断但判断逻辑是一套独立的方法值得单独拎出来分析。4.1 水仙花数和特殊数值本质都是拆位后做条件判断第 7 题水仙花数要求打印所有三位数中各位数字立方和等于该数本身的数。第 11 题特殊数值要求找出前两位与后两位之和的平方等于该数的四位数。水仙花数的难点在于怎么分离出百位、十位、个位。常见做法是用除法和取余#include stdio.h int main() { int n, a, b, c; for (n 100; n 999; n) { a n / 100; b n / 10 % 10; c n % 10; if (a * a * a b * b * b c * c * c n) { printf(%d , n); } } printf(\n); return 0; }逻辑说明a n / 100 取百位b n / 10 % 10 先整除 10 去掉个位再取余得到十位c n % 10 取个位。三层拆位可以应用到任何固定位数的数字。参数说明输出格式上水仙花数的预期输出是 153 370 371 407。我在实际跑的时候输出带尾部空格判断系统一般不严查尾部空格但如果你追求规范可以用 first 变量控制。第 11 题特殊数值先拆前两位和后两位#include stdio.h int main() { int n, front, back, sum; for (n 1000; n 9999; n) { front n / 100; back n % 100; sum front back; if (sum * sum n) { printf(%d , n); } } printf(\n); return 0; }逻辑说明前两位是 n / 100 的整数部分后两位是 n % 100。这个来自 3025 的性质——30 25 5555² 3025。运行结果输出 2025 3025 9801与题目一致。这类题我一般会建议学生先手算一个数验证自己的拆位逻辑再写代码。比如 2025前两位 20后两位 2545²2025说明算法正确。4.2 素数判断的两种写法完整遍历和根号优化第 2 题判断 n 是否为素数第 22 题输出 [2,n] 之间的所有素数及个数。素数的定义是只能被 1 和本身整除的正数1 除外。第 2 题判断单个素数用 for 循环从 2 遍历到 n-1#include stdio.h int main() { int n, i; int is_prime 1; scanf(%d, n); if (n 1) { is_prime 0; } for (i 2; i n; i) { if (n % i 0) { is_prime 0; break; } } printf(%d\n, is_prime); return 0; }逻辑说明is_prime 初始化为 1假设是素数一旦发现 n 能被某个 i 整除立即置 0 并 break 跳出循环。注意 n 1 必须单独处理因为 1 不是素数。参数说明这里判断到 n-1 是完整遍历。数学上有一个优化只需要判断到 sqrt(n) 即可。因为如果 n 有大于 sqrt(n) 的因数必然对应一个小于 sqrt(n) 的因数。第 22 题输出 [2,n] 之间所有素数时n 如果很大用 sqrt 优化能显著减少计算量。第 22 题我建议把“判断是否是素数”单独写成函数因为输出素数和计数的循环里每遍历一个数都要判断一次函数化之后主逻辑更清爽#include stdio.h #include math.h int is_prime(int n) { int i; if (n 1) return 0; for (i 2; i sqrt(n); i) { if (n % i 0) return 0; } return 1; } int main() { int n, i, count 0, first 1; scanf(%d, n); for (i 2; i n; i) { if (is_prime(i)) { if (first) { printf(%d, i); first 0; } else { printf( %d, i); } count; } } printf( %d\n, count); return 0; }逻辑说明注意输出格式——素数和素数个数之间有两个空格代码里 printf( %d\n, count) 两个空格贴合题目输出样例“2 3 5 7 4”。参数说明sqrt 函数在 math.h 里编译时需要加 -lm 链接数学库如 gcc prime.c -lm。循环里用 i sqrt(n)sqrt(n) 每次循环都会重复计算更好的写法是在循环前 int limit sqrt(n); 然后 for (i 2; i limit; i)。这里有个常见的性能陷阱如果你统计 [2, 100000] 的素数个数每次判断都调用 sqrt 函数的开销不小。工程上的做法是提前算好 limit循环变量只用整数比较避免每次迭代都做浮点计算。4.3 最大公约数辗转相除法的循环写法第 14 题最大公约数裁剪两个正整数 m、n输出它们的最大公约数。最经典的做法是欧几里得算法辗转相除法用 while 循环实现#include stdio.h int main() { int m, n, r; scanf(%d %d, m, n); while (n ! 0) { r m % n; m n; n r; } printf(%d\n, m); return 0; }逻辑说明辗转相除法的核心是 gcd(m, n) gcd(n, m % n)不断用较小的数和余数替换原数直到余数为 0此时的 m 就是最大公约数。比如 m20, n15r5m15n5再算 r0m5n0循环结束输出 5。参数说明这里有一个隐藏细节——如果 m n第一轮循环后 m 和 n 会交换。比如 m15, n20r15m20n15第二轮到正确状态。所以不需要额外判断哪个数大。测试输入 32 8032 % 80 32m80n3280 % 32 16m32n1632 % 16 0m16n0输出 16正确。4.4 数根两种实现方式一种循环拆位、一种数学公式第 18 题数根除了反复拆位累加其实有一个数学结论一个数的数根等于它对 9 取余如果结果是 0 则数根是 9。但这个结论在 C 语言里要小心处理 n0 的情况。我更多时候会鼓励学生用循环实现因为这才是循环题的目的。看循环实现#include stdio.h int main() { int n, sum; scanf(%d, n); while (n 10) { sum 0; while (n 0) { sum n % 10; n / 10; } n sum; } printf(%d\n, n); return 0; }逻辑说明外层 while 判断当前数是否还是一位数内层 while 拆位累加。n 每轮被替换成各位数字之和直到 n 10。比如 8943第一轮 sum24n24第二轮 sum6n6循环结束输出 6。参数说明注意内层 while 结束后 n 被除到 0所以要把 sum 赋给 n而不是把 n 和 sum 混淆。也可以在进入内层前用一个临时变量 t n循环里操作 t最后 n sum——很多学生会在这里翻车内层循环把 n 改成了 0外层下一次判断直接跳出。用取余 9 的一行实现是 n % 9 0 ? 9 : n % 9但这样对 0 还要单独判断而且完全没练到循环。练习阶段我更建议用循环实现。4.5 因数个数和完数穷举范围的边界控制第 13 题因数个数第 23 题完数都涉及穷举因数。因数个数的朴素做法是从 1 遍历到 n每个能整除的都计数#include stdio.h int main() { int n, i, count 0; scanf(%d, n); for (i 1; i n; i) { if (n % i 0) { count; } } printf(%d\n, count); return 0; }逻辑说明n % i 0 意味着 i 是 n 的因数。输入 12因数为 1、2、3、4、6、12count6。测试输入 30因数为 1、2、3、5、6、10、15、30count8。参数说明这个循环可以优化到 sqrt(n)。因为因数成对出现i 和 n/i 同时是因数只需遍历到 sqrt(n) 然后 count2。但要注意完全平方数如 16因子 4 被数了两次需要单独判断 i*i n 时 count 只加 1。练习阶段先把朴素写法写对再谈优化。完数判断本质是“求一个数的所有真因子之和”同样用穷举。第 4.3 节里我已经给了完数的完整代码这里补充一点完数很少——1000 以内只有 6、28、49610000 以内也只有 4 个。如果你看到自己的程序输出大量数字通常是“除自身的因子之和”写漏了“除自身”把 j i 当成了 j i。5. 常见问题排查这 7 个坑我刷题时几乎每个都踩过一轮把 23 题完整过一遍之后我把最常见、最容易让人反复调试的问题汇总成 7 条。每一条都按“现象 → 原因 → 解决”的格式梳理基本覆盖了循环练习里 80% 的翻车点。5.1 循环体末尾没有重新读入数据导致死循环现象程序运行后光标一直闪烁输入数据后没有输出按 CtrlC 才能停止。原因while 循环的条件依赖一个变量但循环体内没有修改这个变量的语句。比如第 9 题奇数和如果读完第一个数后循环体内忘写 scanfnum 永远是初始值条件 num ! 0 永远为真。解决检查循环体内是否有更新条件变量的语句。哨兵值结束型的题目循环体末尾必须有 scanf 读入下一个值。更稳妥的做法是用 do-while 结构先执行循环体再判断条件但 do-while 同样需要在循环体内更新条件变量。5.2 整数除法把小数部分直接丢掉数列求和全是 0现象第 3 题数列求和输入 5输出 0.00000而不是 1.56978。原因1 / (3 * i - 2) 在 C 语言里是整数除法1 除以任何大于 1 的整数结果都是 0sum 累加的全是 0。解决把分子或分母转成浮点。最直接的是写 1.0 / (3 * i - 2)或者 (double)1 / (3 * i - 2)。注意 3 * i - 2 本身是整数只要分子是 1.0整个表达式会自动转成 double 运算。5.3 scanf 读 double 用了 %f 而不是 %lf现象第 20 题幂函数输入 2 5输出结果异常大或者结果不对调试时发现 x 的值是 0 或一个奇怪的小数。原因scanf 中 %f 对应 float*%lf 对应 double*。如果变量声明为 double x但格式写 %f内存布局不一致读入的值是垃圾数据。解决double 类型变量的格式化输入用 %lf输出用 %f 或 %lf 都可以printf 中 float 会自动转 double%f 对两者都适用。养成习惯scanf 里 double 一律 %lf。5.4 水仙花数拆位时弄错 b 的计算顺序现象第 7 题输出结果不是 153 370 371 407可能输出一堆不对的数字或者只输出了 153。原因十位拆位写成 b n / 10 / 10 或者 b n / 100 % 10逻辑混乱。n153 时n / 10 1515 % 10 5这是对的但如果写成 n / 100 % 10得到的是百位1不是十位。解决记住口诀除以 10 的幂去掉低位取余 10 的幂得到低位。十位 n / 10 % 10百位 n / 100 % 10。任何固定位数的拆位都按这个思路推。5.5 最大数初始值设成 0输入全是负数时结果错误现象第 1 题最大数按“输入一批正数输入 0 时结束”来做如果测试数据里有一个数比 0 小或全部是负数输出 0 而不是实际最大值。原因max 初始化为 0第一个数进来时 if (num max) 判断负数小于 0 不会更新 max。解决针对题目“输入一批正数”的场景max 初始化为 0 没问题。但更通用的写法是用第一个输入的值初始化 max。可以先读第一个数确保 max 第一个数再进入循环。第 21 题计数也是同样的问题——最大值初始化为 0 在输入全为负数时会错。5.6 素数判断忘记处理 n1 的情况现象输入 1输出 1判定为素数但 1 不是素数。原因循环 for (i 2; i n; i) 在 n1 时条件不成立循环体不执行is_prime 保持初始值 1。解决在循环之前加 if (n 1) 直接置 is_prime 0。更优雅的做法是在函数开头统一判断 n 1 返回 0。第 22 题输出区间素数时直接从 2 开始遍历天然避开了 1但如果单独判断单个 n 就必须处理。5.7 完数判断把自身当成因子累加现象第 23 题输出 6 28 496 之外还输出了一些别的数字比如 1、2、3 等或者输出 6 28 496 1 这种结果。原因内层循环条件写成 j i把 i 本身也算进因子累加导致 sum i 1 2 3 这种结果。比如 i6因子和变成 123612不等于 6输出反而少了但有些数可能刚好“假完数”被输出。解决内层循环条件是 j i不是 j i。完数定义“除自身外的因子之和”自身必须排除。这些坑在 23 题里反复出现——一旦你发现自己的答案和样例对不上首先检查这几个位置条件变量有没有更新、整数除法有没有幸存者、初始化值是否合理、边界值是否单独处理。我自己的习惯是每道题写完先用题目给的输入样例跑一遍再自己造两个边界数据比如 0、1、最大数跑一遍两遍都对了才看下一题。6. 刷完 23 题后的自查手段把“能跑”变成“经得起测”23 题全部做完之后不建议直接开始下一章内容而是花一点时间做交叉验证。我用的方法是把所有题按“输入输出特征”重新归档成三类然后给每类设计一套通用测试用例批量跑一遍看有没有遗漏。第一类是哨兵值结束型测试用例必须包含哨兵值出现在开头比如第一个就是 0、哨兵值出现在中间、连续多个哨兵值、只有哨兵值没有其他数据。第 1 题最大数如果测试数据是“0”应该无输出或输出默认值而不是报错。第二类是计数型循环重点测 n1 和 n边界上限。第 6 题 n1 时输出 1第 20 题 n50 时 x 的 50 次幂可能溢出如果 x22 的 50 次幂是 1125899906842624double 能装下但 float 会变成无穷大——所以这类题我一般把累乘变量声明为 double。第三类是数学规律题重点做反向验证。水仙花数算完后手动验证 1531³5³3³112527153完数算完后手动验证 496因子 1、2、4、8、16、31、62、124、248和正好 496。这种验证不需要代码但能快速发现自己是不是把条件写反了。还有一个容易被忽略的自查点输出格式的“尾部空格”。很多判题系统忽略尾部空格但有些格式严格的系统不忽略。我在写完水仙花数这类需要空格分隔输出的题之后会用 first 变量控制统一处理而不是在循环体里 printf(%d , n) 留尾部空格。从那以后我每次刷完一组循环题都强制走一遍“边界输入 反向验证 格式检查”三个动作再开始下一个知识点。这个习惯帮我避免了很多重复调试的耗时。希望帮到你。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/10/24 14:39:44

操作系统期末冲刺:进程调度与内存管理核心考点精讲

简介:这是一份面向计算机专业本科生的操作系统课程期末复习笔记,聚焦核心概念梳理与考点精讲,帮助学生高效突破并发、同步、进程管理等难点。资源以1个1.17MB的Word文档(.docx)形式提供,内容结构完整&#…

2026/10/24 14:34:43

AI 智能客服接入企业微信:从消息回调到自动回复的实现思路

AI 智能客服接入企业微信后,可以辅助处理常见问题、业务咨询和服务流程引导。但真正落地时,难点并不只是调用大语言模型,还包括消息获取、上下文管理、回复时机、异常处理和人工客服接管。 如果系统需要处理企业微信外部群中的客户问题&…

2026/10/24 14:34:43

企业微信 API 二次开发:如何设计外部群主动推送任务

在企业微信私域运营中,外部客户群经常需要定时发送活动通知、服务提醒、产品更新和日常运营内容。如果所有消息都由运营人员手动发送,不仅工作量大,也难以保证发送时间和执行记录的一致性。 通过企业微信 API 二次开发,可以将群消…

2026/10/24 15:24:50

老鼠走迷宫:栈与队列实现DFS/BFS寻路可视化

简介:这份C数据结构课设资源围绕“老鼠走迷宫”展开,面向正在学习数据结构与算法、需要完成课程设计或想通过实战巩固搜索算法的学生与开发者。项目以二维数组抽象迷宫,用0和1区分通路与墙壁,并借助深度优先搜索实现随机迷宫生成与…

2026/10/24 15:24:50

Landsat8遥感影像预处理全解析:从辐射定标到监督分类的关键技术

简介:这是一份面向遥感、地信专业学生与初学者的ENVI实习报告,基于Landsat8多光谱影像,系统演示了从原始数据到分析成果的完整遥感处理流程。实验区涵盖城市、农田、森林和水体等多种地物,贴近实际应用场景。内容涵盖波段组合、图…

2026/10/24 15:24:50

SDH指针机制:AU-PTR如何实现物理层时钟容差与抗抖动

简介:本资源为华为官方HCIA-Transmission V2.0认证培训课程核心教材(PDF格式),面向通信工程、网络运维及传输技术初学者,系统解决传输网络基础理论薄弱、主流体制理解碎片化、标准规范缺乏溯源等学习痛点。全书40.99MB…

2026/10/24 15:24:50

禁止修改系统时间程序:Python实现时间防篡改监控与授权保护

简介:这是一份面向软件开发者的系统时间防篡改组件,针对授权验证、日志记录、定时任务等依赖精确时间的场景,帮助防止系统时间被恶意修改。包内共32个文件,约755KB,以dll动态库、h头文件、cpp与c源码、sys驱动、lib静态…

2026/10/24 15:19:49

Spring Boot集成Tesseract OCR工业级落地指南

简介:本资源是一份面向Java后端开发者与OCR技术实践者的Spring Boot集成实战指南,聚焦于使用Tesseract OCR引擎实现高精度中文图片文字识别。内容涵盖Tesseract 5.0(含LSTM神经网络识别能力)的环境配置、chi_sim简体中文模型部署、…

2026/10/23 22:56:35

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/24 0:02:40

MATLAB缩进快捷键与批量格式化实战指南

1. 被自动缩进折磨的那些年如果你写过MATLAB代码,大概率经历过这种场景:从某个文档、网页或者聊天记录里复制了一段代码,粘贴进编辑器之后,每一行前面都带着莫名其妙的空格,有的行首是四个空格,有的是一个T…

2026/10/24 0:02:40

用Poco实现Qt风格信号与槽的跨平台C++方案

简介:本资源是一份面向C中级开发者的技术实践工程,聚焦于在非Qt框架环境下模拟实现Qt核心通信机制——信号与槽,借助Poco网络库的事件系统完成解耦式对象通信。适用于需在跨平台C项目中引入松耦合回调机制、但受限于无法集成Qt依赖的开发场景…

2026/10/24 0:02:40

ESXi裸机虚拟化安装指南:从硬件兼容到虚拟机部署

1. 为什么还要折腾ESXi:从一台闲置机器说起手里攒了几台淘汰下来的迷你主机,配置不算差,i5加16G内存,扔了可惜,装个桌面系统又觉得浪费。这种场景下,ESXi就成了一个绕不开的选择。它是一套裸机虚拟化平台&a…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑