Онлайн компилятор 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],b[count]={0},num; for(int i=0;i<count;i++){ a[i]=x_save%10; num=a[i]; b[num]++; } for(int i=9;i>=0;i--){ if(b[i]>0){ printf("%d",a[i]); } } return 0; }
这段代码试图实现一个功能:输入一个整数,然后按数字从大到小的顺序输出这个整数的各位数字。但代码中存在逻辑错误。

代码首先通过循环计算输入整数的位数,并将每一位数字存入数组a中。然后尝试用数组b来统计每个数字(0-9)出现的次数。最后从9到0遍历,如果某个数字出现过,就输出它。

主要问题在于:

- 在统计数字出现次数时,`b[num]++` 这一行中,`num` 是当前位的数字值(0-9),但数组b的大小是count,而不是10。如果数字大于等于count,会导致数组越界。

- 最后的输出部分,`printf("%d",a[i])` 中i是从9到0,但a数组的索引范围是0到count-1。当count小于10时,访问a[9]等索引会越界,而且这里本意应该是输出数字本身,而不是a数组中的值。

提示:

- 数组b的大小应该根据数字的范围(0-9)来定义,而不是根据位数count。

- 在最后输出时,应该输出数字本身(即循环变量i),而不是a数组中的元素。