2004年秋计算机等级考试上机练习系统部分程序设计题答案

 

1、求斐波那契(Fibonacci)数列中大于t的最小的一个数,结果由函数JSValue返回,其中斐波那契数列F(n)的定义为:

      F(0)=0,F(1)=1

      F(n)=F(N-1)+F(n-2)

 分别计算当t=1000t=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、在65000内找出所有的亲密数对,并将每对亲密数用语句 fprintf(p,"%6d,%6d\n",a,b);”写到考生目录中Paper子目录下的新建文件design.dat中。

说明:若ab1对亲密数,则a的因子和等于bb的因子和等于a、且a不等于b          如:2202841对亲密数,284220也是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);

}

}

 

5abc为区间[1,100]的整数,统计使等式 c/(a*a+b*b)=1成立的所有解的个数,并将统计数以格式"%d"写入到考生目录下新建文件design.dat(若a=1b=3c=101个解,则a=3b=1c=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.000012n次方根(272n-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个点的xy坐标,求下列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、在数组x10个数中求平均值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;float k;

  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);

}      

 

16z=f(x,y)=10*cos(x-4)+5*sin(y-2),x,y取值为区间[0,10]的整数,找出使z取最小值的x1,y1,并将x1y1以格式"%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 寻找并输出11999之间的数m,它满足mm*mm*m*m均为回文数。所谓回文数是指各位数字左右对称,例如12167694249等。满足上述条件的数,如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);

}