Online Compiler C

#include <stdio.h> int ctenehb(int i, int q ) { int p = 1; for( int j =1; j <= q; j++) { p *= i; } return p; } int main() { long long int m; int q=0; scanf("%lld", &m); if (m == 0 ) { printf("0"); return 0; } long long int save = m; while (m>0) { m /= 10; q++; } int A[q]; m =save; int i = q-1; while (m>0) { A[i] = m%10; i--; m /= 10; } long long int q2 =q; long long int save2 = save; for (int j = 0; j<q -1 ; j++) { for (int k = 0; k<q-1; k++) { int t = A[k]; A[k] = A[j]; A[j] = t; long long int m2 = 0; for(int w = 0 ; w < q; w++) { m2 += A[w]*ctenehb(10,q2); q2--; } q2=q; if (m2 >save2) { save = m2; } } } printf("%lld",save2); return 0; }
这段代码试图找出一个整数各位数字重新排列后能得到的最大数值。整体思路是:先统计数字位数,将各位存入数组,然后通过两层循环交换数组元素来尝试所有排列,并比较大小。

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

- 在计算排列后的数值时,`ctenehb(10, q2)` 的指数 `q2` 从 `q` 开始递减,但第一次循环时 `q2` 等于 `q`,这会导致 `10^q` 比实际需要的最高位权重多一位。例如三位数,最高位权重应该是 `10^2`,但这里用了 `10^3`。

- 内层循环中,交换 `A[k]` 和 `A[j]` 后,没有在每次新排列前恢复数组到原始顺序,导致后续排列基于被修改过的数组,无法穷举所有可能。

- 最终输出的是 `save2`(原始输入值),而不是找到的最大值 `save`。