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() { long long int x, x_save, count = 0, o = 0; scanf("%lld", &x); x_save = x; while (x > 0) { count++; x = x / 10; } long long 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 < times; 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++; } long long int max_max = b[0]; for (int i = 0; i < times; i++) { if (b[i] > max_max) { max_max = b[i]; } } printf("%lld", max_max); return 0; }
这段代码试图找出一个整数所有数字排列后能得到的最大值。它先读取一个整数,然后将其每一位数字存入数组,接着通过交换数组元素来生成不同的排列,并计算每个排列对应的数值,最后输出这些数值中的最大值。

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

- 生成排列的逻辑有误。内层循环每次都将当前位与最后一位交换,但外层循环并没有正确遍历所有可能的排列组合,导致生成的排列不完整且有重复。
- 变量 `o` 的递增位置可能不正确,导致数组 `b` 的某些位置未被正确赋值或越界。
- 计算数值时,`a[count - j]` 的索引可能超出数组范围,因为 `j` 从 `count-1` 到 `0`,而 `count - j` 会从 `1` 到 `count`,但数组索引是从 `0` 到 `count-1`。

建议你思考如何系统地生成所有排列,例如使用递归或循环嵌套来交换不同位置的数字,并确保每个排列只被计算一次。同时检查数组索引和循环变量的边界条件。