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

#include <stdio.h> int main() { int a[10], count = 0; long long int n; scanf("%lld", &n); for (int i = 0; n > 0; i++) { a[i] = n % 10; n /= 10; count++; } int max = a[count - 1], q = count - 1; for (int i = 0; i < count; i++) { if (max < a[i]) { max = a[i]; q = i; } } if (q != count - 1) { a[q] = a[count - 1]; a[count - 1] = max; } for (int i = count - 1; i >= 0; i--) { printf("%d", a[i]); } return 0; }
这段代码的功能是:读入一个整数,将其各位数字存入数组(逆序存储),然后找出最大数字,如果最大数字不在最高位,就把它与最高位数字交换,最后输出交换后的数字。

代码存在逻辑问题。你试图将最大数字移到最高位,但最高位在数组中是 `a[count-1]`,而你的交换条件 `if (q != count - 1)` 是正确的,但交换后直接输出数组,此时数组顺序是逆序的(个位在 `a[0]`),所以输出时从 `count-1` 到 `0` 打印,这实际上恢复了原始数字的顺序。但交换操作是在逆序数组上进行的,这会导致最高位和最大数字的位置关系与预期不符。

- 提示1:考虑数组 `a` 中数字的存储顺序。`a[0]` 存的是个位,`a[count-1]` 存的是最高位。你的交换逻辑是在这个逆序数组上操作,但题目要求的是在原数字的最高位和最大数字位交换,你需要想清楚在逆序数组中,最高位和最大数字位分别对应哪个下标。
- 提示2:交换后输出时,你从 `count-1` 到 `0` 打印,这相当于把逆序数组再反转回来。但你的交换是在逆序数组上做的,所以最终输出的数字中,最高位和最大数字的交换效果可能不是你想要的。建议先理清数组顺序与数字位的关系。