真题.docx
- 文档编号:24700783
- 上传时间:2023-05-31
- 格式:DOCX
- 页数:21
- 大小:89.54KB
真题.docx
《真题.docx》由会员分享,可在线阅读,更多相关《真题.docx(21页珍藏版)》请在冰豆网上搜索。
真题
考研算法设计题(交大2009年试题)
2012-09-2113:
13:
19| 分类:
考研辅导| 标签:
|字号大中小 订阅
1、有一分数序列2,3/2,5/3,8/5,13/8,21/13,…,请编写程序求这个序列的前30项之和。
2、对于一个整形二维数组A[m][n],其中m<=80,n<=80,先读入m和n,然后读该数组的全部元素,当m=n时分别求两条对角线上的元素之和(不考虑溢出),否则输出m与n不相等的信息。
3、编写程序用下面公式计算圆周率的近似值:
直到最后一项小于10E-6为止。
4、输入一个字符串,统计一长度不超过2的子串在该字符串中出现的次数。
例如:
输入字符串为:
asdasasdfgasdaszx67mklo,子串为:
as,程序返回值为6。
编写程序实现此功能。
5、编写程序求方程:
2sin(x)-x=0在x=1附近的根。
6、有两个磁盘文件A和B,各存放一行字母,试编写程序,要求把这两个文件中的信息合并(按字母表顺序排列,每个字符只出现一次)后输出到新文件C中去。
7、n人围成一圈,并顺序编号,从第一个人开始按1,2,3顺序,报到3者退出圈子,再从下一个人重新开始报数,依次类推…。
请编写程序找出最后留在圈子中人的原序号。
8、对10个候选人进行选举,现有一个100条记录的选票数据文件in.dat,其数据存放的格式是每条记录的长度为10,记录中第一位表示对第一个人的选举情况,第二位表示对第二个人的选举情况,依次类推,每一位的取值为字符"0"或"1",分别表示未选中和选中,全选不选均为无效选票。
请编写程序统计每个人的选票情况并输出。
参考答案:
//1、有一分数序列2,3/2,5/3,8/5,13/8,21/13,…,请编写程序求这个序列的前30项之和。
#include"stdio.h"
voidmain()
{
inti;
doublefz,fm,newfz,sum=0;
fz=2;
fm=1;
for(i=1;i<=30;i++)
{
sum+=fz/fm;
newfz=fz+fm;
fm=fz;
fz=newfz;
}
printf("Sum=%f\n",sum);
}
//2、对于一个整形二维数组A[m][n],其中m<=80,n<=80,先读入m和n,然后读该数组的全部元素,
//当m=n时分别求两条对角线上的元素之和(不考虑溢出),否则输出m与n不相等的信息。
#include"stdio.h"
#defineMAX80
voidmain()
{
inti,j,m,n,he1=0,he2=0,a[MAX][MAX];
do
{
printf("输入数组的行数及列数(1-%d):
",MAX);
scanf("%d%d",&m,&n);
}while(n<1||n>MAX||m<1||m>MAX);
printf("请按行输入数组各元素的值:
\n");
for(i=0;i { printf("第%2d行: ",i+1); for(j=0;j scanf("%d",&a[i][j]); } printf("原数组如下: \n"); for(i=0;i { for(j=0;j printf("%4d",a[i][j]); printf("\n"); } if(m==n) { for(i=0;i { he1+=a[i][i]; he2+=a[i][n-1-i]; } printf("两对角线之和分别为: %d %d\n",he1,he2); } else printf("m! =n\n"); } //3、编写程序用下面公式计算圆周率的近似值: 直到最后一项小于10E-6为止。 #include"stdio.h" #include"math.h" voidmain() { inti=0; doublesum=0; do { i++; sum+=1.0/(i*i); }while(1.0/(i*i)>=1e-6); printf("圆周率的近似值为: %f\n",sqrt(6*sum)); } //4、输入一个字符串,统计一长度不超过2的子串在该字符串中出现的次数。 //例如: 输入字符串为: asdasasdfgasdaszx67mklo,子串为: as,程序返回值为6。 编写程序实现此功能。 //实质为字符串匹配问题 #include #include #defineN80 voidmain() { charstr[N+1],substr[N+1]; unsignedi,j,k,count=0; printf("请输入原字符串: "); scanf("%s",str); printf("请输入子字符串(长度不超过2): "); scanf("%s",substr); for(i=0;str[i]! ='\0';i++) { j=0; k=i; while(j { j++; k++; } if(j==strlen(substr)) count++; } printf("共出现%d次! \n",count); } //5、编写程序求方程: 2sin(x)-x=0在x=1附近的根。 //用牛顿迭代法 //设r是f(x)=0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y=f(x)的切线L, //L的方程为y=f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标x1=x0-f(x0)/f'(x0),称x1为r的一次近似值。 //过点(x1,f(x1))做曲线y=f(x)的切线,并求该切线与x轴交点的横坐标x2=x1-f(x1)/f'(x1),称x2为r的 //二次近似值。 重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为r的n+1次近似值, //上式称为牛顿迭代公式。 #include #include voidmain() { doublex0=1.99,x1,oldx0; do { x1=x0-(2*sin(x0)-x0)/(2*cos(x0)-1); oldx0=x0; x0=x1; }while(fabs(x1-oldx0)>=0.0000001); printf("方程近似根为: %.10f\n",x1); } //用二分法求方程根 过程如下图: #include #include doublef(doublex) { return2*sin(x)-x; } voidmain() { //a,b分别存放区间下界及上界,c存放区间中点,fa,fb,fc分别存放对应各点函数值,jqd存放精确度 doublea=0.1,b=2,c,fa,fb,fc,jqd=0.00001; intcount=0;//统计迭代次数 fa=f(a); fb=f(b); if(fa*fb==0) if(fa==0) printf("方程根为: %f\n",a); else printf("方程根为: %f\n",b); else if(fa*fb>0) printf("所给定的范围[%f,%f]内不能保证有实根\n",a,b); else { while(b-a>jqd) { count++; c=(a+b)/2; fa=f(a); fc=f(c); if(fc==0) { b=c; a=c; } else if(fa*fc<0) b=c; else a=c; } printf("方程根为: %f,迭代次数: %d次! \n",c,count); } } //6、有两个磁盘文件A和B,各存放一行字母,试编写程序,要求把这两个文件中的信息合并 //(按字母表顺序排列,每个字符只出现一次)后输出到新文件C中去。 //实质为归并排序 #include #include #defineN100//假设最大长度为100 voidmain() { charstr[2][N+1],fn[10],ch,prech; unsignedi,j,k; FILE*fp; for(k=0;k<2;k++) { //以下三条语句用于生成文件名 strcpy(fn,"A"); fn[0]=fn[0]+k; strcat(fn,".txt"); //打开文件 fp=fopen(fn,"r"); if(fp==NULL) printf("文件无法打开! \n"); else { fgets(str[k],N+1,fp);//读取文件内容 printf("File%d: ",k+1);//以下两条语句输出原文件内容 puts(str[k]); for(i=1;i { for(j=0;j if(str[k][j]>str[k][j+1]) { ch=str[k][j]; str[k][j]=str[k][j+1]; str[k][j+1]=ch; } } } fclose(fp); } fp=fopen("C.txt","w"); if(fp==NULL) printf("文件无法打开,数据不能保存! \n"); else { //以下代码实现开重复归并 prech='\0'; for(i=0,j=0;str[0][i]! ='\0'||str[1][j]! ='\0';) { if(str[0][i]=='\0') ch=str[1][j++]; else if(str[1][j]=='\0') ch=str[0][i++]; else if(str[0][i] ch=str[0][i++]; else ch=str[1][j++]; if(prech! =ch) { fprintf(fp,"%c",ch); prech=ch; } } } fclose(fp); //输出结果 fp=fopen("c.txt","r"); if(fp==NULL) printf("文件无法打开! \n"); else { fscanf(fp,"%c",&ch); while(! feof(fp)) { printf("%c",ch); fscanf(fp,"%c",&ch); } printf("\n"); } fclose(fp); } //7、n人围成一圈,并顺序编号,从第一个人开始按1,2,3顺序,报到3者退出圈子,再从下一个人重新开始报数, //依次类推…。 请编写程序找出最后留在圈子中人的原序号。 #include"stdio.h" #include"stdlib.h" #defineMAXN100//最大个数 structNode { intdata; structNode*next; }; voidmain() { structNode*head,*s,*q,*t; intn,m,count=0,i; do//输入总个数 { printf("请输入总个数(1-%d): ",MAXN); scanf("%d",&m); }while((m<1)||(m>MAXN)); do//输入出圈时要数到的个数 { printf("要数到的个数(1--%d): ",m); scanf("%d",&n); }while((n<1)||(n>m)); for(i=0;i { s=(structNode*)malloc(sizeof(structNode)); s->data=i+1; s->next=NULL; if(i==0) { head=s; q=head; } else { q->next=s; q=q->next; } } q->next=head;//形成圈 //以下代码输出原始状态 printf("原始状态: \n"); q=head; while(q->next! =head) { printf("%4d",q->data); q=q->next; } printf("%4d\n",q->data); q=head;//以下代码实现出圈 printf("出圈顺序: \n"); do { count++; if(count==n-1) { t=q->next; q->next=t->next; count=0; printf("%4d",t->data); free(t); } q=q->next; }while(q->next! =q); printf("\n剩下的是%4d\n",q->data); } #include #include #defineMAXN100//最大个数 voidmain() { inti,j,k,temp,*a,m,n; do//输入总个数 { printf("请输入总个数(1-%d): ",MAXN); scanf("%d",&m); }while((m<1)||(m>MAXN)); do//输入出圈时要数到的个数 { printf("要数到的个数(1--%d): ",m); scanf("%d",&n); }while((n<1)||(n>m)); a=(int*)malloc(sizeof(int)); if(a==NULL) printf("程序无法继续运行......\n"); else { for(i=0;i a[i]=i+1; printf("原始顺序如下: \n"); for(i=0;i printf("%4d",a[i]); printf("\n"); for(i=m-1;i>=0;i--) { for(k=1;k<=n;k++) { temp=a[0]; for(j=0;j a[j]=a[j+1]; a[i]=temp; } } printf("出圈的顺序如下,最后一个即为留下来的那一个: \n"); for(i=m-1;i>=0;i--) printf("%4d",a[i]); printf("\n"); } } #include #include #defineMAXN100 //最大个数 voidmain() { inti,j,*a,m,n,s1,w; do//输入总个数 { printf("请输入总个数(1-%d): ",MAXN); scanf("%d",&m); }while((m<1)||(m>MAXN)); do//输入出圈时要数到的个数 { printf("要数到的个数(1--%d): ",m); scanf("%d",&n); }while((n<1)||(n>m)); a=(int*)malloc(sizeof(int)); s1=1; if(a==NULL) printf("程序无法继续运行......\n"); else { for(i=0;i a[i]=i+1; printf("原始顺序如下: \n"); for(i=0;i printf("%4d",a[i]); printf("\n"); //进行(n-2+1)=(n-1)轮处理,每次把第i个人报数后出圈,则将p[i]置于数组的倒数第i个位置上, //而原来第i+1个至倒数第i个元素依次向前移动一个位置。 for(i=m;i>=2;i--) { s1=(s1+n-1)%i;//定位那个出圈的人的顺序号i if(s1==0) s1=i;//若s1=0表示本测出圈的队列中的最后一个人 w=a[s1-1];//w为出圈的那个人的真实序号,因为1-n保存在p[i-1]中 for(j=s1;j a[j-1]=a[j]; a[i-1]=w;//则将p[i]置于数组的倒数第i个位置上 } printf("猴子出列的顺序如下: \n"); for(i=m-1;i>=0;i--) printf("%4d",a[i]); printf("\n"); } } //8、对N个候选人进行选举,现有一个N0条记录的选票数据文件in.dat,其数据存放的格式是每条记录的长度为N, //记录中第一位表示对第一个人的选举情况,第二位表示对第二个人的选举情况,依次类推,每一位的取值为字符 //"0"或"1",分别表示未选中和选中,全选不选均为无效选票。 请编写程序统计每个人的选票情况并输出。 #include"stdio.h" #include"string.h" #defineN10 voidmain(void) { FILE*fp; charstr[N+1]; inti,count,jg[N]={0}; fp=fopen("in.dat","r"); if(fp==NULL) printf("文件无法打开! \n"); else { fgets(str,N+1,fp);//读首行 while(! feof(fp)) { if(strlen(str)==N)//没有不选的 { //统计当前行选中的票数 count=0; for(i=0;i count+=str[i]-'0'; if(count for(i=0;i if(str[i]=='1')//统计各人选票 jg[i]++; } fgets(str,N+1,fp);//读下一行 } fclose(fp); printf("各人得票结果如下: \n"); for(i=0;i printf("%4d",jg[i]); printf("\n"); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 真题.docx
![提示](https://static.bdocx.com/images/bang_tan.gif)