Онлайн компилятор 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[i]; A[i] = 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; }
这段代码试图找出一个整数各位数字重排后能得到的最大数,但存在几个问题。

代码首先读取一个整数,统计其位数,将各位数字存入数组,然后通过两层循环交换数组元素,每次交换后计算新数值,并与原数比较更新最大值。最后输出的是原数 `save2` 而不是找到的最大值。

- 在最后输出时,你打印的是 `save2`(原始输入值),而不是循环中更新过的 `save`。这意味着无论循环做了什么,输出始终是原始数字。
- 交换逻辑中使用了变量 `i`,但此时 `i` 的值是 `-1`(因为之前的 while 循环将 `i` 减到了 -1)。这会导致数组访问越界,产生未定义行为。你需要重新思考如何正确遍历所有排列,或者使用一个有效的索引变量。