在线编译器 C

#include <stdio.h> int ctenehb(int i, int q ) { int p = 1; for( int j =1; j <= q; j++) { q *= 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; }
这段代码试图找出一个数字各位数字重新排列后能得到的最大值,但存在几个关键问题。

函数 `ctenehb` 本意是计算幂次,但循环中错误地修改了参数 `q`,导致结果不正确。同时变量 `p` 始终为1,没有累乘。

主函数中,变量 `i` 在第一个循环后已经变为 -1,但后续又用 `i` 作为数组索引进行交换,这会导致数组越界访问。

- 检查 `ctenehb` 函数:循环条件使用了 `j <= q`,但循环体内又修改了 `q` 的值,这会导致循环次数失控。应该用一个临时变量来保存乘法的结果,并且不要修改传入的参数。
- 注意变量 `i` 的作用域:在第一个 while 循环后 `i` 的值已经变为 -1,后续又用 `A[i]` 进行交换,这是错误的。需要重新思考如何正确遍历数组元素进行排列。