/*主要思路:
1、首先将数字都读入临时分配空间的数组,并且将其转换为字符串数组便于处理。
2、将字符串都填补为所有数据中最大值相同的位数。如第一个例子中13,312,343填补后为133,312,343;第二个例子中7,13,4,246变为777,133,444,246。
3、字符串排序,同时排序的顺序也影响最初的数字数组。
4、从大到小输出成文件。
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fpInput,*fpOutput;//输入输出文件指针
long n,maxNum,tempNum;//n为读取的数字个数,maxNum是其中最大值,tempNum为中间量
long *num;//数据存放的地方
int i,j,len;//一些控制量
char lastNum;//数字的最后一位
char *tempStr;
char **strNum;//将数字转换为字符串后存放的地方
fpInput=fopen("F:\\s.in","r");
fscanf(fpInput,"%d",&n);//读取一共多少个数
num=(long*)malloc(n*sizeof(long));//分配内存空间
strNum=(char**)malloc(n*sizeof(char*));
maxNum=0;
len=0;
for (i=0;i<n;i++)//循环读入数据
{
fscanf(fpInput,"%d",num+i);
if (*(num+i)>maxNum)//找出最大值,用于判断最大位数为几位
{
maxNum=*(num+i);
}
}
fclose(fpInput);//输入文件关闭
do//获取最大值的位数
{
len++;
maxNum=maxNum/10;
}while(maxNum>0);
tempStr=(char*)malloc((len+1)*sizeof(char));
for (i=0;i<n;i++)
{
strNum[i]=(char*)malloc((len+1)*sizeof(char));//为每个转换为字符串的数字分配内存空间
memset(strNum[i],0,(len+1)*sizeof(char));//初始化为0
ltoa(*(num+i),strNum[i],10);//将数字转换为字符串,以十进制转换
lastNum=strNum[i][strlen(strNum[i])-1];//找到数字的最后一位
for (j=strlen(strNum[i]);j<len;j++)//将剩下空位用最后一位数字按照最大值的位数填补
{
strNum[i][j]=lastNum;
}
}
for (i=0;i<n-1;i++)//字符串排序
{
for (j=i;j<n;j++)
{
if (strcmp(strNum[i],strNum[j])==-1)//如果字符串i小于字符串j,那么换位,同时源数据(数字数组)也换位
{
strcpy(tempStr,strNum[i]);
strcpy(strNum[i],strNum[j]);
strcpy(strNum[j],tempStr);
tempNum=num[i];
num[i]=num[j];
num[j]=tempNum;
}
}
}
fpOutput=fopen("F:\\s.out","wb");
for (i=0;i<n;i++)//按从大到小顺序输出
{
fprintf(fpOutput,"%d",num[i]);
}
fclose(fpOutput);//关闭输出文件
free(num);//释放分配的内存空间
free(tempStr);
free(*strNum);
free(strNum);
system("pause");
}
写的慢了点,望有帮助...
测试图片。