Online Compiler C

#include <stdio.h> int main() { int n; scanf("%d", &n); int a[10], ai = 0; while (n > 0) { a[ai] = n % 10; ai++; n = n / 10; } int num[10], ni = 0; while (ai >= 0) { num[ni] = a[ai]; ni++; ai--; } for (int i = 0; i < ni; i++) { printf("%d\n", num[i]); } int max = num[0], start = 0, now = 0; for (int j = 0; j < ni; j++) { for (int i = start; i < ni; i++) { if (max < num[i]) { max = num[i]; now = i; } } if (num[j] == max) { start++; max = num[start]; } if (num[j] < max) { num[now] = num[j]; num[j] = max; for (int i = 0; i < ni; i++) { printf("%d\n", num[i]); } return 0; } } }
这段代码的功能是:读入一个整数,将其各位数字按顺序存入数组,然后尝试进行一次选择排序的交换操作,并在交换后立即输出数组并结束程序。

代码中存在逻辑错误,导致排序行为不符合预期。

- 第一个循环将数字的各位逆序存入数组a,第二个循环又将其反转存入num,最终num中存储的是数字的原始顺序。这部分是正确的。
- 后续的排序逻辑试图找到最大值并交换,但循环控制条件有误。外层循环j从0开始,内层循环i从start开始,但每次外层循环都会重新设置max为num[start],这会导致比较基准不断变化,无法正确找到整个数组的最大值。
- 当num[j]小于max时,代码执行交换并立即返回,这意味着只进行一次交换就结束,而不是完成整个排序。而且交换后没有继续处理剩余元素,导致排序不完整。

提示:
- 检查内层循环中max的更新逻辑。每次外层循环开始时,max被重置为num[start],但内层循环中又用max < num[i]来更新max,这会导致max始终是当前start之后的最大值,而不是整个数组的最大值。思考一下,如果要在整个未排序部分找最大值,max的初始值应该是什么?
- 注意代码中一旦执行交换就return 0结束程序。这意味着只进行一次交换就停止,而不是继续排序剩余部分。想一想,如果要完成整个排序,应该在什么时候结束循环?