在线编译器 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) { ai--; num[ni] = a[ai]; ni++; } 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]; } else if (num[j] < max) { num[now] = num[j]; num[j] = max; for (int i = 0; i < ni; i++) { printf("%d", num[i]); } return 0; } } for (int i = 0; i < ni; i++) { printf("%d", num[i]); } return 0; }
这段代码的作用是:读入一个整数,将其各位数字存入数组,然后尝试找到一种交换方式,使得交换一次后得到的数字最大。但代码的逻辑存在一些问题。

- 代码先将数字的每一位存入数组 `a`,然后反转存入 `num`,得到原始顺序的各位数字。
- 接着用两层循环试图找到一次交换能得到的最大数字,但循环和条件判断的逻辑有误,导致可能无法正确找到最优交换位置。

- 提示1:你的外层循环变量 `j` 和内层循环变量 `i` 都在遍历同一个数组,但内层循环每次从 `start` 开始找最大值,而 `start` 的更新方式可能不正确。思考一下:要找到一次交换能得到的最大数字,应该从高位向低位扫描,找到第一个可以交换的位置,而不是用两层循环嵌套的方式。

- 提示2:当 `num[j] < max` 时,你直接交换并输出,但此时 `max` 可能并不是从 `j` 之后所有数字中的最大值,因为内层循环只找了一次最大值,但没有考虑如果有多个相同最大值时应该交换最后一个。另外,交换后直接 `return 0` 会忽略后面可能还有更大的交换可能。