一.选择
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));
}