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

#include <stdio.h> int main() { char s[20]; scanf("%s", s); int n = 0; while (s[n] != '\0') n++; int pos = -1; for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < n; j++) { if (s[j] > s[i]) { pos = i; break; } } if (pos != -1) break; } if (pos == -1) { printf("%s\n", s); return 0; } char max_digit = s[pos + 1]; int max_pos = pos + 1; for (int j = pos + 2; j < n; j++) { if (s[j] >= max_digit) { max_digit = s[j]; max_pos = j; } } char temp = s[pos]; s[pos] = s[max_pos]; s[max_pos] = temp; printf("%s\n", s); return 0; }
这段代码的功能是:读入一个数字字符串,找到第一个位置,使得该位置右侧存在比它大的数字,然后把这个位置和右侧最大的数字交换,最后输出结果。如果找不到这样的位置(即数字是降序排列),则直接输出原字符串。

- 代码中的两层循环用于寻找第一个满足条件的位置 `pos`,但逻辑上有一个问题:当找到 `s[j] > s[i]` 时,`pos` 被设为 `i` 并跳出内层循环,但此时并没有检查 `i` 之后是否还有更合适的交换位置。实际上,题目可能要求找到最靠右的、能通过交换得到更大数字的位置,而不是第一个。

- 在寻找右侧最大数字时,条件 `s[j] >= max_digit` 使用了 `>=`,这会导致如果有多个相同最大数字,会选择最右边的那个。但需要确认题目是否要求选择最右边的最大数字,还是最左边的。这个细节会影响最终结果。