Онлайн компилятор C

#include <stdio.h> int main(){ int x,x_save,count=0; scanf("%d",&x); x_save=x; while(x>0){ count++; x=x/10; }int a[count]; for(int i=0;i<count;i++){ a[i]=x_save%10; x_save=x_save/10; } for(int i=count-1;i>=0;i--){ int num=0; while(num<count){ if(a[i]>a[num]){ int temp=a[i]; a[num]=a[i]; a[i]=temp; break; } else num++; }printf("%d",a[i]); } return 0; }
这段代码试图将输入整数的各位数字按从大到小排序并输出,但存在逻辑错误。

代码首先读取整数,计算位数,然后将各位数字存入数组。接着尝试排序,但排序部分的逻辑有问题。

- 排序循环中,当发现 `a[i] > a[num]` 时,交换操作写错了:`a[num]=a[i]` 这一行把较大的值又覆盖回去了,导致交换无效。同时,交换后立即 `break` 跳出循环,这不符合排序算法的正确流程。
- 排序完成后,输出是在排序循环内部进行的,每次交换后都会输出当前 `a[i]` 的值,而不是在排序全部完成后统一输出。

- 思考一下:如果要实现从大到小排序,通常需要两层循环完整遍历所有元素,而不是在发现一次大小关系后就中断。另外,输出应该放在排序完成之后。