Online Compiler C

#include <stdio.h> int power(int x, int y) { int i = 1, last = 1; while (i <= y) { last = last * x; i++; } return last; } int main() { int x, x_save, count = 0, o = 0; scanf("%d", &x); x_save = x; while (x > 0) { count++; x = x / 10; } int a[count]; for (int i = count - 1; i >= 0; i--) { a[i] = x_save % 10; x_save = x_save / 10; } long long int max = 0; int times = count * count, last = count - 1; int b[times]; for (int i = 0; i < count; i++) { for (last = count - 1; last >= 0; last--) { int temp = a[i]; a[i] = a[last]; a[last] = temp; for (int j = count - 1; j >= 0; j--) { max += power(10, j) * a[count - j]; } } // b[o] = max; o++; } int max_max = b[0]; for (int i = 0; i < times; i++) { if (b[i] > max_max) { max_max = b[i]; } } printf("%d", max_max); return 0; }
这段代码试图找出一个整数各位数字重新排列后能组成的最大数值。整体思路是:先读取一个整数,提取它的每一位数字存入数组,然后通过交换数组中的数字来生成不同的排列,计算每种排列对应的数值,最后找出最大值。

代码中存在几个关键问题:

- 外层循环只遍历了 `count` 次,但每次只交换了第一个元素和最后一个元素,并没有生成所有可能的排列。实际上,要生成所有排列需要更复杂的算法(如递归或回溯),或者可以换个思路:直接对数字数组进行排序(从大到小)就能得到最大数,不需要枚举所有排列。

- 变量 `times` 被设为 `count * count`,但实际生成的排列数量远少于这个数,导致数组 `b` 中很多位置未被赋值,后续比较时可能用到未初始化的值。

- 内层循环中每次交换后计算数值,但交换操作会改变数组 `a` 的内容,且没有恢复原状,导致后续循环基于已修改的数组继续操作,结果混乱。

- 变量 `o` 在每次外层循环中递增,但内层循环每次都会覆盖 `b[o]`,且 `o` 没有在每次外层循环开始时重置,导致数组 `b` 的索引使用错误。

建议你思考如何更高效地解决这个问题:对于一个数字的各位,要组成最大的数,应该怎样排列这些数字?是否真的需要枚举所有排列?