6-1 递归计算Ackermenn函数 (25分)
本题要求实现Ackermenn函数的计算,其函数定义如下:
函数接口定义:
int Ack( int m, int n );
其中m和n是用户传入的非负整数。函数Ack返回Ackermenn函数的相应值。题目保证输入输出都在长整型
范围内。
裁判测试程序样例:
#include <stdio.h>
int Ack( int m, int n );
int main()
{
int m, n;
scanf("%d %d", &m, &n);
printf("%d\n", Ack(m, n));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
2 3
输出样例:
9
int Ack(int m,int n)
{
int k;
if(m==0)
k=n+1;
if(n==0&&m>0)
k=Ack(m-1,1);
if(m>0&&n>0)
k=Ack(m-1,Ack(m,n-1));
return k;
}
6-2 递归求Fabonacci数列 (25分)
本题要求实现求Fabonacci数列项的函数。Fabonacci数列的定义如下:
f(n)=f(n−2)+f(n−1) (n≥2),其中f(0)=0,f(1)=1。
函数接口定义:
int f( int n );
函数f应返回第n个Fabonacci数。题目保证输入输出在长整型范围内。建议用递归实现。
裁判测试程序样例:
#include <stdio.h>
int f( int n );
int main()
{
int n;
scanf("%d", &n);
printf("%d\n", f(n));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
6
输出样例:
8
int f(int n)
{
int s;
if(n==0)
s=0;
else if(n==1)
s=1;
else
s=f(n-2)+f(n-1);
return s;
}
6-3 递归求阶乘和 (15分)
本题要求实现一个计算非负整数阶乘的简单函数,并利用该函数求 1!+2!+3!+…+n! 的值。
函数接口定义:
double fact( int n );
double factsum( int n );
函数fact应返回n的阶乘,建议用递归实现。函数factsum应返回 1!+2!+…+n! 的值。题目保证输入输出在双精度范围内。
裁判测试程序样例:
#include <stdio.h>
double fact( int n );
double factsum( int n );
int main()
{
int n;
scanf("%d",&n);
printf("fact(%d) = %.0f\n", n, fact(n));
printf("sum = %.0f\n", factsum(n));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
10
输出样例1:
fact(10) = 3628800
sum = 4037913
输入样例2:
0
输出样例2:
fact(0) = 1
sum = 0
double fact(int n)
{
double x;
if(0==n)
return 1;
else
x=fact(n-1)*n;
return x;
}
double factsum(int n)
{
int s=0,i;
for(i=1;i<=n;i++)
s+=fact(i);
return s;
}
6-4 统计平均分,最高分及得最高分人数 (35分)
请编写一个函数fun,函数的功能是:统计出若干个学生的平均成绩,最高分以及得最高分的人数。
函数接口定义:
float fun(float array[],int n);
其中 array 和 n 都是用户传入的参数。函数须统计 array数组中学生的平均成绩,最高分以及得最高分的人数,函数返回平均成绩,最高分以及得最高分的人数存放在全局变量 Max 和 J中 。
裁判测试程序样例:
#include <stdio.h>
float Max=0;
int J=0;
float fun(float array[],int n);
int main()
{
float a[10],ave;
int i=0;
for(i=0;i<10;i++)
scanf("%f",&a[i]);
ave=fun(a,10);
printf(“ave=%.2f\n”,ave);
printf(“max=%.02f\n”,Max);
printf(“Total:%d\n”,J);
return 0;
}
/* 请在这里填写答案 */
输入样例:
84 75 86 59 25 94 76 84 15 65
输出样例:
ave=66.30
max=94.00
Total:1
float fun(float array[],int n)
{
double f;
int i,j=0;
for(i=0;i<n;i++)
f+=array[i];
f=f/n;
for(i=1;i<n;i++)
{
if(array[j]<array[i])
j=i;
}
Max=(int)array[j];
for(i=0;i<n;i++)
if(Max==(int)array[i])
J++;
return f;
}