C语言程序设计教程李凤霞第三版第八章答案

一.选择

1.B;函数内不可以嵌套定义函数,但可以嵌套调用

2.C

3.C

4.A

5.A;调用函数时,只能单向传递,将实参值传递给形参;B:函数内不可以嵌套定义函数,但可以嵌套调用;C:void类型,无返回值;D:不必须,例如:调用前,申明或定义这个函数就行

6.C;外部变量的隐含类别是静态存储类别,内部变量的隐含类别是自动存储类别

7.C

8.D

9.D

10.B

11.A;所有的递归程序均可以采用非递归算法实现,而别不是所用非递归算法均可以采用递归算法实现

12.C

13.A;所有的形参都是自动变量

14.C

15.B

二.填空

1. return (n)/(1)

    return(n+sum(n-1))

2.return (n)

   n*facto(n-1)

三.编程题

1.编写一个判断一个整数是否是素数的函数,使用该函数编写验证1000以内的哥德巴赫猜想成立。

#include <stdio.h>
int main( )
{
 int i,j,k=0;
    for ( i=6; i<=1000; i+=2 )/*遍历6-1000*/ 
       for ( j=1; j<=i/2; j+=2 )
	   if ( flag(j) && flag(i-j) )  /*如果俩个都是素数*/ 
	   {
	   { 
	   	 printf("%d=%d+%d ", i, j, i-j);
	   	 k++;
	   }
	   if(k==8) /*每八个换行*/ 
	   {
	   	printf("\n");
		   k=0; 
	   }
	    break;
}
 }
 flag ( int n) /* 函数flag的功能是判断整数n是否为素数 */
 {  int i;
    if ( n%2==0) return(0);/*有除一及本身外因子则不是素数*/ 
    for ( i=3; i<n/2; i++ )/*写n/2或n都行,遍历3到n/2-1或n-1的因子*/ 
    if ( n%i==0 )
    return(0);
    return(1);
 }

2.编写一个程序,调用函数已知一个圆筒的半径、外径和高,计算该圆筒的体积。

#include<stdio.h>
double v(double r,double h )
 {    return (3.14*r*r*h);
 }
int  main( )
 {  double r1, r2, h, v();
    printf ("请输入外圆半径r1 内圆半径r2 高h:\n");
    scanf ("%lf%lf%lf", &r1, &r2, &h);
    printf ("v=%lf\n", v(r1,h)-v(r2,h));/*大圆柱减小圆柱*/ 
 }

3.编写一个求水仙花数的函数,求100到999之间的全部水仙花数。所谓水仙花数是指一个三位数,其各位数字立方的和等于该数。

#include<stdio.h>
int main( )
 {   int i=0,j,k,a,b,c,s;
   for (a=1; a<=9; a++)
    for (b=0; b<=9; b++)
	 for (c=0; c<=9; c++)
	    { j=100*a+10*b+c;
	      if ( ex(j) )
		 printf ("%d=%d*%d*%d+%d*%d*%d+%d*%d*%d\n", j,a,a,a,b,b,b,c,c,c);
	    }
 }
 int ex(int m)
 {    int sum=0, z, k;
      z=m;
      while (z>0)   
	  {
	 k= z%10;/*从个位开始取数*/ 
	 sum += k*k*k;
	 z /= 10;
      }
      return ( m==sum );
 }

4.请编写一个函数,输出整数m的全部素数因子。例如:m=120时,因子为:2,2,2,3,5

#include<stdio.h>
int main ( )
   {  int m;
      printf ("Enter m=");
      scanf ("%d", &m);
      primedec (m);
   }
   primedec (int m)
   {  int k=2;/*因子从二开始 */
      while (k<=m)
         if (m%k == 0 )
          {  printf ("%d, " , k);
             m = m/k;
          }
         else  k++;
   }

5.已知某数列前两项为2和3,其后继项根据当前的前两项的乘积按下列规则生成:① 若乘积为一位数,则该乘积就是数列的后继项;② 若乘积为二位数,则乘积的十位和个位数字依次作为数列的后继项。当N=10,求出该数列的前十项为:2 3 6 1 8 8 6 4 2 4。 

#include<stdio.h> 
#define N 20
int main()
{int i,n,a[10];
 shul(a,10);
 for(i=0;i<10;i++)
 printf("%d ",a[i]);
 printf("\n");
 }
shul(int x[],int k)
{int i=0,m,n;
 x[0]=2;x[1]=3;
 for(i=2;i<k;i++)
  {m=x[i-1]*x[i-2];
   if(m>=10)
   {x[i++]=m/10;
    x[i]=m%10;
   }
   else x[i]=m;
   }
}

6.求组合数。编程计算:c(m,n)=m!/(n!*(m-n)!)

#include<stdio.h>
 int factorial(int n)/*求正整数的阶乘*/ 
{int s=1;
for(;n>0;n--)
 s=s*n;
 return s;
 }
int  main()
{int m,n,c;
 scanf("%d %d",&m,&n);
 c=factorial(m)/factorial(n)/factorial(m-n);
 printf("c(%d,%d)=%d\n",m,n,c);
 } 

7.已知 ackermann 函数,对于 m>=0 和 n>=0 有如下定义:
ack(0,n)=n+1
ack(m,0)=ack(m-1,1)
ack(m,n)=ack(m-1,ack(m,n-1))
请编程输入m和n,求出ack(m,n)之值。

#include <stdio.h>
ackerman ( int m, int n )
 {  if ( m==0 ) return (n+1);
    if ( n==0 ) return ( ackerman ( m-1, 1) );
    else        return ( ackerman ( m-1, ackerman(m, n-1) ) );
 }
int main( )
 {  int m, n;
    printf ("Enter ackerman m n:");
    scanf ("%d%d", &m, &n);
    printf ("ackerman(%d,%d)=%d\n", m,n,ackerman(m,n) );
 }

8.用递归的方法打印杨辉三角形。

 

#include <stdio.h>
int main( )
{  int i,j,n;
   printf("N=");
      scanf("%d", &n);                        /* 最大输入值不能大于12 */
   for ( i=0; i<=n; i++ )                             /* 控制输出N行 */
   {  for ( j=0; j<12-i; j++ )
          printf("   ");                  /* 控制输出第i行前面的空格 */
      for ( j=1; j<i+2; j++ )
          printf("%6d", c(i,j));              /* 输出第i行的第j个值 */
      printf("\n");
   }
}
int c(x,y)                          /* 求杨辉三角形中第x行第y列的值 */
   int x, y;
{  int z;
   if ( (y==1) || (y==x+1) )
       return(1);                /* 若为x行的第1或第x+1列或者说第1列及对角线,则输出1 */
   else                 /* 否则;其值为前一行中第y-1列与第y列值之和 */
       z = c(x-1,y-1) + c(x-1,y); 
   return(z);
}

9.编写一递归程序实现任意正整数向八进制数的转换。

  #include <stdio.h>
int main ( )
   {  int m;
      printf ("Enter m=\n");
      scanf ("%d", &m);
      printhex (m);
   }
   printhex ( int m )
   {  if ( m>=8 )
	  printhex (m/8);
      printf ("%d", m%8);
   }

 10.验证卡布列克运算。任意一个四位数,只要它们各个位上的数字是不全相同的,就有这样的规律:
① 将组成这个四位数的四个数字由大到小排列,形成由这四个数字构成的最大的四位数;
② 将组成这个四位数的4个数字由小到大排列,形成由这4个数字构成的最小的四位数(如果四个数字中含有0,则得到的数不足四位);
③ 求两个数的差,得到一个新的四位数。
重复以上过程,最后得到的结果总是6174。

#include <stdio.h>
int main()
{int w;
 scanf("%d",&w);
 printf("%d",fac(w));
}    
int max(int  m)/*排序求最大*/ 
{int a[5],k,p,t;
 a[0]=m%10;
 a[1]=m/10%10;
 a[2]=m/100%10;
 a[3]=m/1000;
 for(k=0;k<3;k++)
  for(p=0;p<3-k;p++)
{
	if(a[p]>a[p+1])
	{t=a[p];
	 a[p]=a[p+1];
	 a[p+1]=t;
	}
};
return (a[3]*1000+a[2]*100+a[1]*10+a[0]);
}
int min(int n)/*排序求最小*/ 
{int b[5],i,j,l;
 b[0]=n%10;
 b[1]=n/10%10;
 b[2]=n/100%10;
 b[3]=n/1000;
for(j=0;j<3;j++)
	 for(i=0;i<3-j;i++)
{
	if(b[i]>b[i+1])
	{l=b[i];
	 b[i]=b[i+1];
	 b[i+1]=l;
	}
}	
return (b[0]*1000+b[1]*100+b[2]*10+b[3]);
}
fac(int x)/*做递归*/ 
{
if(x==6174)
return 6174;
return	fac(max(x)-min(x));
	
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈哈不开心*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值