Онлайн компилятор 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; } int save2 = m; for (int j = 0; j<q ; j++) { for (int k = 0; k< q; k++) { int t = A[k]; A[k] = A[i]; A[i] = t; int m2 = 0; int q2 =q; for(int w = 0 ; w < q2; w++) { m2 += A[w]*ctenehb(10,q); q--; } if (m2 >save2) { save = m2; } } } for(int j = 0 ; j < q; j++) { printf("%d",A[j]); } return 0; }
这段代码试图找出一个整数各位数字重新排列后能得到的最大数,但存在多个错误。

主要问题在于函数 `ctenehb` 和循环逻辑。`ctenehb` 本意是计算幂次,但内部修改了参数 `q`,导致循环条件改变,并且返回的 `p` 始终为1,没有正确计算 `i` 的 `q` 次方。另外,在构建数字 `m2` 时,循环内又修改了 `q`,导致数组索引混乱。交换数字的循环也使用了错误的变量 `i`(此时 `i` 已为 -1),并且 `save2` 被错误地赋值为 `m`(此时 `m` 已为0)。

- 检查 `ctenehb` 函数:循环中修改了参数 `q`,这会影响循环次数。思考如何在不改变循环条件的情况下计算幂次。
- 注意变量作用域和值的变化:在构建 `m2` 的循环中,`q` 被递减,但外层循环也依赖 `q`,这会导致数组访问越界。考虑使用一个临时变量来保存位数。