2004年秋计算机等级考试上机练习系统部分程序设计题答案
1、求斐波那契(Fibonacci)数列中大于t的最小的一个数,结果由函数JSValue返回,其中斐波那契数列F(n)的定义为:
F(0)=0,F(1)=1
F(n)=F(N-1)+F(n-2)
分别计算当t=1000和t=3000时的结果,将计算结果输出到考生目录中Paper子目录下的新建文件design.dat中。
#include<stdio.h>
int JSValue(int t)
{int a[20],i=1;
a[0]=1;a[1]=1;
while(a[i]<t)
{
i++;
a[i]=a[i-1]+a[i-2];
}
return a[i];}
void main( )
{
FILE *p;
p=fopen("design.dat","w");
fprintf(p,"%d,%d",JSValue(1000),JSValue(3000));
fclose(p);
}
2、计算字符串s中每个字符的权重值,所谓权重值就是字符在字符串中的位置值与该字符的ASCII码值的乘积。位置值从1开始依此递增。将每个字符的权重值,以格式"%d "写入到考生目录中Paper子目录下的新建文件design.dat中。
#include<stdio.h>
#include<math.h>
void main()
{
FILE *p; int i,w[20];
char *s="we45*&y3r#$1";
p=fopen(“design.dat”,”w”);
i=1;
while (*s!=’\0’)
{
w[i]=i*(*s);
fprintf(p,”%d”,w[i]);
fputc(‘\n’,p);
i++;
s++;
}
fclose(p);
}
3、对x=1,2,...,10,求函数f(x)=x-10*cos(x)-5*sin(x)的最大值,并将该数以格式"%.3f"写到考生目录中Paper子目录下的新建文件design.dat中。
#include <stdio.h>
#include <math.h>
void main()
{
FILE *p; float
f(float),max,x;
max=f(1);
for(x=1;x<=10;x++)
if
(max<f(x)) max=f(x);
p=fopen(“design.dat”,”w”);
fprintf(p,”%f”,max);
fclose(p);
}
float f(float x)
{
float y;
y=
x-10*cos(x)-5*sin(x) ;
return y;
}
4、在6至5000内找出所有的亲密数对,并将每对亲密数用语句 fprintf(p,"%6d,%6d\n",a,b);”写到考生目录中Paper子目录下的新建文件design.dat中。
说明:若a、b为1对亲密数,则a的因子和等于b、b的因子和等于a、且a不等于b。 如:220、284是1对亲密数,284、220也是1对亲密数。
#include <stdio.h>
void main()
{ FILE *p; int a,b,c,k;
p=fopen("design.dat","w");
for(a=6;a<5000;a++)
{
b=1;
for(k=2;k<=a/2;k++)
if(a%k==0)
b+=k;
c=1;
for(k=2;k<=b/2;k++)
if (b%k==0) c+=k;
if (a==c && a!=b) fprintf(p,“%d,%d\n”,a,b);
fclose(p);
}
}
5、a、b、c为区间[1,100]的整数,统计使等式 c/(a*a+b*b)=1成立的所有解的个数,并将统计数以格式"%d"写入到考生目录下新建文件design.dat(若a=1、b=3、c=10是1个解,则a=3、b=1、c=10 也是解)
#include <stdio.h>
void main()
{
FILE *p; int n=0,a,b,c;
p=fopen(“design.dat”,”w”);
for(a=1;a<=100;a++)
for (b=1;b<=100;b++)
for(c=1;c<=100;c++)
if ((c/(a*a+b*b))== 1) n=n+1;
fprintf(p,”%d”,n);
fclose(p);
}
6、选出5000以下符合条件的自然数。条件是:千位数字与百位数字之和等于十位数字与个位数字之和,且千位数字与百位数字之和等于个位数字与千位数字之差的10倍。计算并输出这些四位自然数的个数cnt及这些数字的和sum到考生目录中Paper子目录下的新建文件design.dat中。
#include<stdio.h>
void main()
{
FILE *p;
int cnt,sum;
int
i,qianwei,baiwei,shiwei,gewei;
cnt=0,sum=0;
p=fopen("design.dat","w");
for(i=1000;i<5000;i++)
{qianwei=i/1000;
baiwei=i/100-qianwei*10;
shiwei=i/10-baiwei*10-qianwei*100;
gewei=i%10;
if((qianwei+baiwei==shiwei+gewei)&&(qianwei+baiwei==10*(gewei-qianwei))
)
{cnt++; sum=sum+i; }
}
fprintf(p,"%d,%d",cnt,sum);
fclose(p);
}
7、计算多项式a0+a1*x+a2*x*x+a3*x*x*x+...的值,并将其值以格式"%f"写到考生目录中Paper子目录下的新建文件design.dat中。
#include <stdio.h>
#include <math.h>
void main()
{ FILE *p; int i; float
x=1.279,t=1,y=0;
float
a[10]={1.1,3.2,-2.5,5.67,3.42,-4.5,2.54,5.6,0.97,4.65};
p=fopen("design.dat","w");
y=a[0] ; t=a[0];
for(i=1;i<3;i++)
{
t=t*a[i]*x/a[i-1];
y=y+t;
}
fprintf(p,"%f",y);
fclose(p);
}
8、计算27的小于1.00001的2n次方根(27的2n-2次方根不小于1.00001), 将n以格式"%d"写到考生目录中Paper子目录下的新建文件design.dat中。
#include <stdio.h>
#include <math.h>
void main()
{
FILE *p; float
x=27; int n=0;
p=fopen("design.dat","w");
while(sqrt(x)>1.00001)
{
n++;
x=sqrt(x);
}
fprintf(p,"%d",n+1);
fclose(p);
}
9、设计程序:x[i],y[i]分别表示平面上1个点的x、y坐标,求下列5点各点间距离总和,并将该数以格式"%.4f"写到考生目录中Paper子目录下的新建文件design.dat中。
#include <stdio.h>
#include <math.h>
void main()
{
FILE *p; float
s,x[5]={-1.5,2.1,6.3,3.2,-0.7};
float y[5]={7,5.1,3.2,4.5,7.6}; int i,j;
float sum=0;
p=fopen("design.dat","w");
for(i=0;i<5;i++)
for(j=0;j<5;j++)
sum=sum+sqrt(pow(x[i]-x[j],2)+pow(y[i]-y[j],2));
sum=sum/2;
fprintf(p,"%.4f",sum);
fclose(p);
}
10、
数列第1项为81,此后各项均为它前1项的正平方根,统计该数列前30项之和,并以格式"%.3f"写到考生目录中Paper子目录下的新建文件design.dat中。
#include <stdio.h>
#include <math.h>
void main()
{
FILE *p; float
s=0,a=81,i;
p=fopen("design.dat","w");
for(i=0;i<30;i++)
{s=s+a;
a=sqrt(a);
}
fprintf(p,"%.3f",s);
fclose(p);
}
11、在数组x的10个数中求平均值v,找出与v相差最小的数组元素并将其以格式"%.5f"写到考生目录中Paper子目录下的新建文件design.dat中。
#include <stdio.h>
#include <math.h>
void main()
{ FILE *p; int i,k=0;
float
x[10]={7.23,-1.5,5.24,2.1,-12.45,6.3,-5,3.2,-0.7,9.81},d,v=0;
for(i=0;i<10;i++) v+=x[i]; v=v/10;
d=fabs(x[0]-v);
for(i=1;i<10;i++)
if(fabs(x[i]-v)<d)
{
d=fabs(x[i]-v);
k=i;
}
p=fopen("design.dat","w");
fprintf(p,"%.5f",x[k]);
fclose(p);
}
12 计算多项式a0-a1*x+a2*x*x/2!-a3*x*x*x/3!+...的值,并将其以格式"%f"写到考生目录中Paper子目录下的新建文件design.dat中。
#include <stdio.h>
#include <math.h>
void main()
{ FILE *p; int i; float
x=1.279,t,y;
float
a[10]={1.1,3.2,-2.5,5.67,3.42,-4.5,2.54,5.6,0.97,4.65};
t=1;y=0;
for(i=0;i<10;i++)
{
y+=a[i]*t;
t=-t*x/(i+1);
}
p=fopen("design.dat","w");
fprintf(p,"%f",y);
fclose(p);
}
13、计算2的平方根、3的平方根、...10的平方根之和,要求计算结果具有小数点后10位有效位数,并以格式"%.10f\n"写到考生目录中Paper子目录下的新建文件design.dat中。
#include <stdio.h>
#include <math.h>
void main()
{ FILE *p;
int i; double s=0;
for(i=2;i<=10;i++)
s+=sqrt(i);
p=fopen("design.dat","w");
fprintf(p,"%.10f\n",s);
fclose(p);
}
14、将数组a的每1行均除以该行上的主对角元素(第1行同除以a[0][0],第2行同除以a[1][1],...),然后将a数组写入到考生目录中Paper子目录下的新建文件design.dat中。
#include <stdio.h>
void main()
{ float
a[3][3]={{1.3,2.7,3.6},{2,3,4.7},{3,4,1.27}};
FILE *p;int i,j;
for(i=0;i<3;i++)
{
k=a[i][i];
for(j=0;j<3;j++) a[i][j]/=k;
p=fopen("design.dat","w");
for(i=0;i<3;i++) {
for(j=0;j<3;j++)
fprintf(p,"%10.6f",a[i][j]);
fprintf(p,"\n");
}
fclose(p);
}
15、数列各项为1,1,2,3,5,8,13,21,...,求其前40项之和,并将求和的结果以格式"%d"写到考生目录中Paper子目录下的新建文件design.dat中。
#include <stdio.h>
void main()
{ FILE *p; long
s=0,i,a[40];
a[0]=1;a[1]=1;s=a[0]+a[1];
for (i=2;i<40;i++)
{
a[i]=a[i-1]+a[i-2];
s+=a[i];
}
p=fopen("design.dat","w");
fprintf(p,"%ld",s);
fclose(p);
}
16、z=f(x,y)=10*cos(x-4)+5*sin(y-2),若x,y取值为区间[0,10]的整数,找出使z取最小值的x1,y1,并将x1、y1以格式"%d,%d"写入到考生目录中Paper子目录下的新建文件design.dat中。
#include<stdio.h>
#include<math.h>
void main()
{
FILE *p;
int x,y,x1,y1; float z,z1;
x1=0;y1=0;
z1=10*cos(-4)+5*sin(-2);
for(x=0;x<=10;x++)
for(y=0;y<=10;y++)
if((z=10*cos(x-4)+5*sin(y-2))< z1)
{
z1=z;x1=x;y1=y;
}
p=fopen("design.dat","w");
fprintf(p,"%d,%d",x1,y1);
}
17、
寻找并输出11至999之间的数m,它满足m、m*m、m*m*m均为回文数。所谓回文数是指各位数字左右对称,例如121、676、94249等。满足上述条件的数,如m=11,m^2=121,m^3=1331皆为回文数。请编制函数int JSValue(long m)实现此功能,如果是回文数,则函数返回1,反之则返回0。最后把结果输出到考生目录中Paper子目录下的新建文件design.dat中。
法一:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int JSValue(long m)
{
long k=0,n;
n=m;
while(m)
{
k=k*10+m%10;
m/=10;
}
if(k==n)return 1;
else return 0;
}
void main()
{
FILE *p;long m;
p=fopen("design.dat","w");
for(m=11;m<1000;m++)
{
if(JSValue(m)&&JSValue(m*m)&&JSValue(m*m*m))
fprintf(p,"%ld ",m);
}
fclose(p);
}
法二:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int JSValue(long m)
{
char a[30],*s=a;
int i,k;
while(m)
//while循环用于讲m的各位数字取出存入字符数组a中
{
*s=m%10+'0';
s++;
m=m/10;
}
s--; k=(s-a)/2;
for(i=0;i<=k;i++,s--) //判断回文
{
if(*s!=a[i]) break;
}
if(i>k)return 1;
else return 0;
}
void main()
{
FILE *p;long m;
p=fopen("design.dat","w");
for(m=11;m<1000;m++)
{
if(JSValue(m)&&JSValue(m*m)&&JSValue(m*m*m))
fprintf(p,"%ld ",m);
}
fclose(p);
}