大神求解,C语言问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大神求解,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");

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

测试图片。

参考技术A #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);获得字符串
不都差不多么。。。本回答被提问者采纳
参考技术B 就是一个简单的排序呗
首先重新定义一下大小比较
对于两个字符串A,B,如果AB>BA,那么A大,反之B大

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

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

追答

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

求!1+!2+!3+!4+!5 注:!5=1*2*3*4*5; 求用C语言编出来 我学到循环结构 求解 最好写些注释让我容易懂

你说只学到循环,所以本程序中没有用自定义函数。用一个二重循环来描述合式中出现的一般项,而每次求一般项是,均需把k归1。
#include<stdio.h>
main()

int i,j,k,sum=0;
for(i=1;i<=5;i++)

k=1;
for(j=1;j<=i;j++)
k*=j; /*用k表示合式中的一般项,如:1!,2!
循环中i表示其中的1,2。而j是求阶乘的辅助变量*/
sum+=k; /*sum用来存放各项之和*/

printf("1!+2!+3!+4!+5!=%d\n",sum);

参考技术A #include<stdio.h>
int cal(int num)//计算!num

int result=1;
for(int i=1;i<=num;i++) //!num=1*2*3*..*(num)
result*=i;
return result;


int main()

int sum=0;
for(int i=1;i<=5;i++)
sum+=cal(i);
printf("%d\n",sum);

为了简单,只使用了循环。。
参考技术B int sum=0;//记录求和
for(int i=1;i<=5;i++)//枚举1-5

int t=1;//记录阶乘
for(int j=1;j<=i;j++)//计算1-i的阶乘
t=t*i;阶乘
sum=sum+t;求和
参考技术C 这个题目应该有这样的一个思路的!!首先必须要有两个变量,一个用来存累计和,一个用来存阶乘,即累积积!!求阶乘时可以利用函数递归调用,然后有了这个思路就应该好做啦!!
long power(int m)
long f;
f=m*power(m-1);
return f;

main()
int i,n,sum=0;
for(i=1;i<=5;i++)
sum+=power(i);
printf("%d",sum);

程序就是这样子的!!如果有点问题的话,你可以上机去调试,问题应该不是很大的!!

以上是关于大神求解,C语言问题的主要内容,如果未能解决你的问题,请参考以下文章

C语言 结构体 求大神求解 为啥执行end->next->num 无法执行呢

C语言用矩阵求解方程组

C语言 编写递归函数

高分悬赏 求解2道MATLAB编程题目

求!1+!2+!3+!4+!5 注:!5=1*2*3*4*5; 求用C语言编出来 我学到循环结构 求解 最好写些注释让我容易懂

求解啊, C语言的一个问题