考研算法设计题(交大2009年试题)
2012-09-21 13: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的子串在该字符串中出现的次数。例如:输入字符串为:asd
asasdfg asd as zx67 mklo,子串为: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\"
void main()
{
}
int i; fz=2; fm=1; { sum+=fz/fm; newfz=fz+fm;
fm=fz; fz=newfz; }
double fz,fm,newfz,sum=0;
for(i=1;i<=30;i++)
printf(\"Sum=%f\\n\
//2、对于一个整形二维数组A[m][n],其中m<=80,n<=80,先读入m和n,然后读该数组的全部元素,
//当m=n时分别求两条对角线上的元素之和(不考虑溢出),否则输出m与n不相等的信息。
#include \"stdio.h\" #define MAX 80 void main()
{
int i,j,m,n,he1=0,he2=0,a[MAX][MAX];
do {
printf(\"输入数组的行数及列数(1-%d):\
scanf(\"%d%d\
}while(n<1||n>MAX||m<1||m>MAX);
for(i=0;i{printf(\"第%2d行:\
for(j=0;j} else } }printf(\"请按行输入数组各元素的值:\\n\");
printf(\"原数组如下:\\n\");
for(i=0;i{for(j=0;j} if(m==n){ {
he1+=a[i][i]; he2+=a[i][n-1-i];
}
for(i=0;iprintf(\"两对角线之和分别为:%d %d\\n\printf(\"m!=n\\n\");
//3、编写程序用下面公式计算圆周率的近似值:直到最后一项小于10E-6为止。
#include \"stdio.h\" #include \"math.h\"
void main()
{
int i=0; double sum=0;
do { i++;
sum+=1.0/(i*i);
}while(1.0/(i*i)>=1e-6);
}
printf(\"圆周率的近似值为:%f\\n\
//4、输入一个字符串,统计一长度不超过2的子串在该字符串中出现的次数。
//例如:输入字符串为:asd asasdfg asd as zx67 mklo,子串为:as,程序返回值为6。编写程序实现此功能。
//实质为字符串匹配问题
#include #include #define N 80void main()
{
char str[N+1],substr[N+1]; unsigned i,j,k,count=0; printf(\"请输入原字符串:\");
scanf(\"%s\ scanf(\"%s\ for(i=0;str[i]!='\\0';i++)
}
//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的一次近似值。
{ j=0; k=i; { j++; k++; } count++; }
printf(\"请输入子字符串(长度不超过2):\");
while(jif(j==strlen(substr))printf(\"共出现%d次!\\n\
//过点(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 void main()
{
double x0=1.99,x1,oldx0;
do { oldx0=x0; x0=x1;
x1=x0-(2*sin(x0)-x0)/(2*cos(x0)-1);
}while(fabs(x1-oldx0)>=0.0000001); printf(\"方程近似根为:%.10f\\n\
}
//用二分法求方程根
过程如下图:
#include #include double f(double x) { }void main() { 度
double a=0.1,b=2,c,fa,fb,fc,jqd=0.00001; int count=0;//统计迭代次数 fa=f(a); fb=f(b);
//a,b分别存放区间下界及上界,c存放区间中点,fa,fb,fc分别存放对应各点函数值,jqd存放精确return 2*sin(x)-x;
}
if(fa*fb==0) else
if(fa*fb>0) else { }
while(b-a>jqd) { }
printf(\"方程根为:%f,迭代次数:%d次!\\n\
count++; c=(a+b)/2; fa=f(a); fc=f(c); if(fc==0) { } else
if(fa*fc<0) else
a=c; b=c; b=c; a=c;
printf(\"所给定的范围[%f,%f]内不能保证有实根\\n\ if(fa==0) else
printf(\"方程根为:%f\\n\ printf(\"方程根为:%f\\n\
//6、有两个磁盘文件A和B,各存放一行字母,试编写程序,要求把这两个文件中的信息合并
//(按字母表顺序排列,每个字符只出现一次)后输出到新文件C中去。
//实质为归并排序 #include #include #define N 100 //假设最大长度为100
void main()
{
char str[2][N+1],fn[10],ch,prech;
unsigned i,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)
else {
//以下三条语句用于生成文件名
printf(\"文件无法打开!\\n\");
fgets(str[k],N+1,fp);//读取文件内容
} fclose(fp); }
}
puts(str[k]);
{
if(str[k][j]>str[k][j+1])
{ ch=str[k][j]; str[k][j]=str[k][j+1]; str[k][j+1]=ch;
}
printf(\"File %d:\以下两条语句输出原文件内容 for(i=1;ifor(j=0;jfp=fopen(\"C.txt\if(fp==NULL)
else { prech='\\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++];printf(\"文件无法打开,数据不能保存!\\n\");
//以下代码实现开重复归并
for(i=0,j=0;str[0][i]!='\\0' || str[1][j]!='\\0';)
else ch=str[1][j++]; {
if(prech!=ch) fprintf(fp,\"%c\
prech=ch; } } } fclose(fp); //输出结果
fp=fopen(\"c.txt\
if(fp==NULL)
else {
while(!feof(fp))
} } fclose(fp);
{
printf(\"%c\ fscanf(fp,\"%c\
} printf(\"\\n\");
printf(\"文件无法打开!\\n\");
fscanf(fp,\"%c\
//7、n人围成一圈,并顺序编号,从第一个人开始按1,2,3顺序,报到3者退出圈子,再从下一个人重新
开始报数,
//依次类推…。请编写程序找出最后留在圈子中人的原序号。
#include \"stdio.h\" #include \"stdlib.h\" #define MAXN 100 //最大个数
struct Node
{
int data; struct Node *next;
}; void main()
{
struct Node *head, *s, *q, *t;
int n, m, count=0, i; do//输入总个数
{
printf(\"请输入总个数(1-%d):\
scanf(\"%d\
}while((m<1)||(m>MAXN)); do//输入出圈时要数到的个数
{
scanf(\"%d\
printf(\"要数到的个数(1--%d):\
}while((n<1)||(n>m));
{ s->data=i+1; s->next=NULL;
}
if(i==0) { head=s; q=head; } else { q->next=s; q=q->next; }
for(i=0;iq->next=head;//形成圈 //以下代码输出原始状态 printf(\"原始状态:\\n\");q=head;
{ q=q->next; }
while(q->next!=head) printf(\"%4d\
printf(\"%4d\\n\ q=head;//以下代码实现出圈 printf(\"出圈顺序:\\n\");
do { count++; if(count==n-1)
{ t=q->next; q->next=t->next;
count=0;
printf(\"%4d\
free(t); } q=q->next;
}while(q->next!=q);
}
#include #includeprintf(\"\\n剩下的是%4d\\n\
#define MAXN 100 //最大个数
void main()
{
int i,j,k,temp,*a,m,n; do//输入总个数
{
scanf(\"%d\
printf(\"请输入总个数(1-%d):\
}while((m<1)||(m>MAXN)); do//输入出圈时要数到的个数
{
scanf(\"%d\
printf(\"要数到的个数(1--%d):\
}while((n<1)||(n>m)); a=(int *)malloc(sizeof(int));
if(a==NULL)
else {
for(i=0;ia[i]=i+1;printf(\"程序无法继续运行......\\n\");
printf(\"原始顺序如下:\\n\");
for(i=0;i=0;i--) { { temp=a[0]; for(j=0;ja[j]=a[j+1]; a[i]=temp; }for(k=1;k<=n;k++)
}
printf(\"出圈的顺序如下,最后一个即为留下来的那一个:\\n\");
for(i=m-1;i>=0;i--) printf(\"%4d\ printf(\"\\n\"); } }
#include #include #define MAXN 100 //最大个数void main()
{
int i,j,*a,m,n,s1,w; do//输入总个数
{
scanf(\"%d\
printf(\"请输入总个数(1-%d):\
}while((m<1)||(m>MAXN)); do//输入出圈时要数到的个数
{
scanf(\"%d\
printf(\"要数到的个数(1--%d):\
}while((n<1)||(n>m)); a=(int *)malloc(sizeof(int));
s1=1; if(a==NULL)
else {
for(i=0;ia[i]=i+1;printf(\"程序无法继续运行......\\n\");
printf(\"原始顺序如下:\\n\");
for(i=0;i//进行(n-2+1)=(n-1)轮处理,每次把第i个人报数后出圈,则将p[i]置于数组的倒数第i个位置上,//而原来第i+1个至倒数第i个元素依次向前移动一个位置。
for(i=m;i>=2;i--)
{ if(s1==0)
s1=(s1+n-1)%i; //定位那个出圈的人的顺序号i 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\ printf(\"\\n\"); }
//8、对N个候选人进行选举,现有一个N0条记录的选票数据文件in.dat,其数据存放的格式是每条记录的
长度为N,
//记录中第一位表示对第一个人的选举情况,第二位表示对第二个人的选举情况,依次类推,每一位的取值
为字符
//\"0\"或\"1\",分别表示未选中和选中,全选不选均为无效选票。请编写程序统计每个人的选票情况并输出。
#include \"stdio.h\" #include \"string.h\" #define N 10 void main(void)
{
FILE *fp; char str[N+1]; int i,count,jg[N]={0}; fp=fopen(\"in.dat\
if(fp==NULL)
printf(\"文件无法打开!\\n\");
}
else {
while(!feof(fp)) { { count=0; for(i=0;ijg[i]++;if(strlen(str)==N)//没有不选的
//统计当前行选中的票数
fgets(str,N+1,fp);//读首行
if(countfgets(str,N+1,fp);//读下一行} fclose(fp); for(i=0;iprintf(\"%4d\printf(\"\\n\"); }
printf(\"各人得票结果如下:\\n\");