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; } } }
这段代码的功能是:读入一个整数,将其各位数字按顺序存入数组,然后尝试进行一次排序操作,但排序逻辑不完整。

代码首先将整数n的各位数字逆序存入数组a(例如输入123,a中为3,2,1),然后通过第二个循环将a中的数字反转存入数组num(得到1,2,3),最后打印num。接着代码试图对num进行排序,但排序算法有错误。

- 第一个提示:注意第二个while循环中,当ai从最大值递减时,你使用`a[ai]`来赋值,但此时ai已经比实际存储的最大索引大1(因为之前ai++后多了一次)。检查一下数组a中有效元素的索引范围,以及第二个循环中ai的初始值是否正确。
- 第二个提示:排序部分的逻辑混乱。你似乎想实现选择排序,但内层循环每次从start开始找最大值,然后判断num[j]与max的关系。但变量start和now的更新方式不正确,导致排序只进行了一次交换就返回了。思考一下:选择排序应该先找到未排序部分的最大值,然后与当前位置交换,而不是在找到最大值后立即判断并可能提前结束。