【字符】组成最大数
任意输入一个自然数,输出该自然数的各位数字组成的最大数。例如,输入 1593 ,则输出为 9531 。
输入:
自然数 n
输出:
各位数字组成的最大数
样例:
序号 | 测试输入 | 期待的输出 | 额外进程 |
---|---|---|---|
1 | 1593↵ | 9531↵ | 0 |
思路
其实就是排序算法,排序算法的种类很多,这里采用的是冒泡和选择排序,详情参考排序算法-百度百科
代码
#include <stdio.h>
#include <string.h>
main()
{
int i,j,len;
char a[10000];
scanf("%s",a);
len = strlen(a);
for(i=0;i<len;i++) //冒泡排序
{
for(j=len-1;j>i;j--)
{
if(a[j]>a[j-1]) a[j]=a[j]+a[j-1]-(a[j-1]=a[j]);
}
}
int k; //选择排序
for(i = 0; i < len; i ++) {
for(j = i+1; j < len + 1; j ++) {
if(a[i] < a[j]) {
k = a[i];
a[i] = a[j];
a[j] = k;
}
}
}
printf("%s\n",a);
}
课外思考
有没有内存占用更少,速度更快的方法?
当然是有的,因为要最大数,所以我们只需要分别统计0-9的出现次数,然后依次输出对应个数的数字就好了
其实就是计数排序
三行搞定
#include <stdio.h>
int num[10],x;
int main(){
while((x = getchar())!='\n') num[x - '0']++;
for(int i = 9;i >= 0;i --) while(num[i]--) printf("%d",i);
return 0;
}