大神求解,C语言问题
最大整数。(string.pas)设有n个正整数(n≤30000),将它们联接成一排,组成一个最大的多位整数。例如:n=3时,3个整数13,312,343联接成的最大整数...
最大整数。(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
文件包含一行数据,即联接成的多位数。
求思路,附上代码
高手最好附代码,特别是字符函数那一块,定义操作字符之类的太生疏········思路我倒是有点数 展开
设有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");
}
写的慢了点,望有帮助...
测试图片。
展开全部
#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);获得字符串
不都差不多么。。。
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);获得字符串
不都差不多么。。。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
就是一个简单的排序呗
首先重新定义一下大小比较
对于两个字符串A,B,如果AB>BA,那么A大,反之B大
然后给30000个数排序,然后从大到小输出就OK了
代码没有,自己敲
首先重新定义一下大小比较
对于两个字符串A,B,如果AB>BA,那么A大,反之B大
然后给30000个数排序,然后从大到小输出就OK了
代码没有,自己敲
追问
写字符串函数时有很多疑问·····不懂那些字符串函数的使用格式····
追答
自己试,别人的代码看一遍就忘了,自己摸索敲出来的不会忘
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询