大神求解,C语言问题

最大整数。(string.pas)

设有n个正整数(n≤30000),将它们联接成一排,组成一个最大的多位整数。

例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213

又如:n=4时,4个整数7,13,4,246联接成的最大整数为:7424613

输入文件:s.in

文件第一行包含一个正整数,即正整数的个数n,文件第二行为n个正整数,各数之间用空格分隔。

输出文件:s.out

文件包含一行数据,即联接成的多位数。
求思路,附上代码
高手最好附代码,特别是字符函数那一块,定义操作字符之类的太生疏········思路我倒是有点数

/*主要思路:
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");
}

写的慢了点,望有帮助...

测试图片。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-08-13
#include<stdlib.h>
void scanf_file()
{
char str[256];
int i,j,k,k1=0;
int total_num;

FILE *fi = fopen("s.in","r"); //s.in 和编译出的 .exe 可执行文件同目录即可
FILE *fo = fopen("..\\s.out","wb");// 该目录下输出s.out
fscanf(fi,"%d",&j); //获得一个整形数据到 j
for(i=0;i<j;i++) //循环 j 次

{
fscanf(fi,"%d",&k); //获得一个整形数据到 k
(fscanf本身遇到空格和换行时结束)
total_num = combine_num(k , k1); // k1用于记录读出的k的大小,初始为0
//combine_num函数完成的功能:
//比较 k 的首位 和 k1 的 首位 谁大 将大的那个放在前面保证生成的总数据为最大的
// 如果首位相等,继续比较第二位的大小。
// 如果其中的一个数字大小 和 另一个数字 的前几位完全相同,例如 35 和 351,这时候

// 比较麻烦 需要多处理一步 不过总是有办法的 只要不急着组合数据 返回一个标志位,后面可利用这个标志进行判断组合处理 等下次参数传入做具体判断就好了 大体思路就是这样 这个函数的代码就不给出了 比较麻烦 还要去判断数据的位数 获得首位还要做%(余操作) 其实这里的数据完全可以用获得字符串的形式 而不是获得整形数据 因为字符串的操作,无论是比较,还是合并,还是获得某位数据 ,比整形的处理代码量要少很多,也简单很多,合并后只要用 atoi 函数就可以了 atoi是将字符串转为整形数据 。。。是不是很简单。。。由于你题目给的是int型
,我就先这样弄了。
k1=k; //k1 用于保存记录 之前读到的数据 k

} //循环j次 后 并获得合并的数据 存放到total_num

fwrite(&total,4,1,fo); //写数据
fclose(fo); //关闭文件
fclose(fi);
}
至于你说的字符串函数格式都是大同小异 无非就是%s %d %c

最长用的就是sprintf
char *path;
sprintf(path,”%s%d123“,"hello",12);path = "hello12123";
sprinrf ( path, ”123“); path = “123” ;
和 fscanf(fi,"%d",&j); 获得整形 fscanf(fi,"%s",path);获得字符串
不都差不多么。。。本回答被提问者采纳
第2个回答  2013-08-13
就是一个简单的排序呗
首先重新定义一下大小比较
对于两个字符串A,B,如果AB>BA,那么A大,反之B大

然后给30000个数排序,然后从大到小输出就OK了
代码没有,自己敲追问

写字符串函数时有很多疑问·····不懂那些字符串函数的使用格式····

追答

自己试,别人的代码看一遍就忘了,自己摸索敲出来的不会忘