任意输入一个自然数,输出该自然数的各位数字组成的最大数。例如,输入 1593 ,则输出为 9531 。
输入:自然数 n
输出:各位数字组成的最大数
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
思路:
这是一道经典的排序题,我们可以使用冒泡排序法。它的思路是用两层for循环嵌套,外层循环输入的数字的位数“len”次,内层从最左侧的数字开始,与其右侧相邻数比较,如果比其小,则二者互换位置,如此循环“len-1-外层循环已经循环的次数”次。如果某次循环没有任何互换位置的情况发生,则说明已经排列完毕,停止循环并输出结果。
为什么是“len-1-外层循环已经循环的次数”次呢?我们可以观察一下冒泡排序的过程图(网络图片,侵权删)。每完成一次外层循环,这组数中的最值,必定已经如泡泡般浮到了边界位置,所以下一次就可以少比较一次了。
#include <stdio.h>
#include <string.h>
int main(){
char arr[100];
int flag;
gets(arr);
int len= strlen(arr);
for (int i = 0; i < len; ++i)
{
flag=0;
for (int j = 0; j < len-1-i; ++j)
{
if(arr[j]<arr[j+1])
{
char p=arr[j];
arr[j]=arr[j+1];
arr[j+1]=p;
flag=1;
}
}
if(flag==0)
{
break;
}
}
for (int i = 0; i < len; ++i)
{
printf("%c",arr[i]);
}
printf("\n");
}