在线编译器 C

#include <stdio.h> int main() { int a[100]; int x, n = 0; scanf("%d", &x); while (x > 0) { a[n] = x % 10; n++; x = x / 10; } n = n - 1; int n_max, c; for (int i = 0; i < n - 1; i++) { n_max = i; for (int j = i + 1; j < n; j++) { if (a[n_max] < a[j]) { n_max = j; } } if (n_max != i) { c = a[i]; a[i] = a[n_max]; a[n_max] = c; } } for (int i = 0; i < n; i++) { printf("%d", a[i]); } return 0; }
这段代码的作用是:读入一个正整数,将其各位数字提取到数组中,然后按从大到小排序,最后输出排序后的数字序列。

代码中存在一个逻辑错误,导致排序和输出可能不正确。

- 在提取数字的循环结束后,`n` 被减了1(`n = n - 1`),这导致后续排序和输出时少处理了一位数字。思考一下:`n` 原本记录的是数字的位数,减1后变成了最大下标,但循环条件 `i < n - 1` 和 `j < n` 以及输出时的 `i < n` 都基于这个减1后的值,可能会漏掉最后一位数字。

- 排序算法是选择排序,但外层循环的终止条件 `i < n - 1` 在 `n` 被减1后,可能使得循环次数不足。检查一下当 `n` 等于原始位数时,循环应该执行多少次才正确。