大神求解,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 <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 无法执行呢
求!1+!2+!3+!4+!5 注:!5=1*2*3*4*5; 求用C语言编出来 我学到循环结构 求解 最好写些注释让我容易懂