程序代码:
/*******************************************************************************
一个排序的问题
设有N个正整数(N<20),将它们连成一排,组成一个最大的多位数。程序输入:N,
程序输出:N个数连接成的多位数。
【提示】:(老师告诉我们的提示)
设计思路:
比如我们输入的是 123 2 33 1006 12 这样几个数
我们先找出最大的数字的位数为四位,在将所有的数字变成四位数:
1230 2000 3300 1006 1200
然后从大到小排序:3300 2000 1230 1200 1006
这样将后面加上的0去掉的序列就是最大的数字:332123121006
*******************************************************************************/
#include<stdio.h>
#define N 20
int jc(int a)
{
if(a>1000&&a<=9999) return 4;
if(a>100&&a<999) return 3;
if(a>10&&a<99) return 2;
}
int num(int a,int b) /* 用递归法把小数值加零 */
{
if(a<b) num(a*10,b);
else return(a);
}
void sore(int *p,int *q,int k) /* 选择排序函数 */
{
int i,j,m,tmp;
for(i=0;i<k;i++)
{
m=i;
for(j=i+1;j<k;j++)
if(p[m]<p[j]) m=j;
if(m!=i)
{
tmp=p[m];
p[m]=p[i];
p[i]=tmp;
tmp=q[m];
q[m]=q[i];
q[i]=tmp;
}
}
}
int main(void)
{
int INPUT[N];
int _input[N];
int max=0;
int i,j,k;
printf("下面请输入数据。系统默认是20个数字,如果要提前结束输入,请输\n"
"入负数.另外系统默认输入是4位数,如果输入数值过大,此次操作无效。\n");
for(k=0;k<N;k++) /* 输入 */
{
printf("input NO.%d\n",k+1);
scanf("%d",&INPUT[k]);
if(INPUT[k]<0) break;
if(INPUT[k]>=10000)
{
k--;
continue;
}
}
for(i=0;i<k;i++)
{
_input[i]=INPUT[i];
if(max<INPUT[i]) max=INPUT[i]; /* 找出最大数值 */
}
j=jc(max);
switch(j)
{
case 4: j*=1000; break;
case 3: j*=100; break;
case 2: j*=10; break;
}
for(i=0;i<k;i++)
_input[i]=num(_input[i],j); /* 把小数值加零 */
sore(_input,INPUT,k); /* 数组排序 */
printf("output :\n\n\n");
for(i=0;i<k;i++) /* 输出 */
printf("%d",INPUT[i]);
getch();
}