Online Compiler C

#include <stdio.h> int main() { int n; scanf("%d", &n); int num[100], ni = 0; while (n > 0) { num[ni] = n % 10; ni++; n = n / 10; } int temp; int is_sort = 0; while (!is_sort) { is_sort = 1; for (int i = 0; i < ni - 1; i++) { if (num[i] > num[i + 1]) { temp = num[i]; num[i] = num[i + 1]; num[i + 1] = temp; is_sort = 0; } } } for (int i = 0; i < ni; i++) { printf("%d", num[i]); } return 0; }
这段代码的功能是:读入一个整数,将其各位数字提取到数组中,然后对数组进行冒泡排序(升序),最后输出排序后的数字序列。

代码存在一个逻辑问题:提取数字时是从个位开始依次存入数组,所以数组中的顺序是逆序的(例如输入123,数组为[3,2,1])。排序后输出的是升序排列的数字,但输出时没有考虑原数字的位数顺序,导致结果可能不符合预期。

- 提示1:思考一下,如果输入是321,当前代码会输出什么?你希望输出的是原数字各位从小到大排列后的结果,但当前提取顺序和排序后的输出是否真正实现了这个目标?
- 提示2:检查提取数字的循环,它把最低位放在了数组开头。排序后输出的是从小到大的数字序列,但这是否等同于原数字各位数字的升序排列?注意输出时没有处理前导零的情况。