请编写高效递归函数,求组合数。
函数原型
double Cmb(int x, int y);
说明:x 和 y 为非负整数,且 x ≥ y ≥ 0,函数值为组合数 Cxy。
要求:不要使用循环语句,不要调用阶乘函数和排列数函数。找出最快的递推公式,该函数直接调用自己求得结果。
裁判程序:
#include
double Cmb(int x, int y);
int main()
{
int m, n;
scanf("%d%d", &m, &n);
printf("%.10g\n", Cmb(m, n));
return 0;
}
/* 你提交的代码将被嵌在这里 */
double Cmb(int x, int y){
double m;
if(x<0||y<0||x<y){
m=0;
}
else if(y==0){
m=1;
}
else if(y>x/2){
y=x-y;
m=Cmb(x,y);
}
else{
m=x*Cmb(x-1,y-1)/y;
}
return m;
}
doubleCmb(int x, int y){
int x,y,sum,c,x1,y1,sum1;
sum=y-x;
x1 = fact(x);
y1 = fact(y);
sum1 = fact(sum);
c=y1/(x1*sum1);
printf("%d",c);
int fact(int n){
if(n==1) return 1;
else return n*fact(n-1);
}
}
请编写递归函数,显示矩形。
函数原型
void Rect(int width, int height, char symbol);
说明:参数 width 和 height 为矩形的宽和高,symbol 为显示字符。函数将在屏幕下显示宽度为 width、高度为 height 由字符 symbol 组成的矩形。若 width 或 height 小于等于 0,则不输出。
要求:不要使用循环语句。需要利用前面作业中的 Show 函数,可增加自用的内部函数。
裁判程序
#include
void Show(int number, char symbol);
void Rect(int width, int height, char symbol);
int main()
{
int w, h;
char s;
scanf("%d %d %c", &w, &h, &s);
Rect(w, h, s);
return 0;
}
......
/* 你提交的代码将被嵌在这里 */
输入样例1
-3 -4 #
输出样例1
注:无输出。
输入样例2
20 5 *
输出样例2
********************
********************
********************
********************
********************
关联习题:重复显示字符(递归版)
void Rect(int width, int height, char symbol){
if(height>0&&width>0){
Show(width,symbol);
printf("\n");
height=height-1;
Rect(width,height,symbol);
}
}
请编写递归函数,输入若干整数,求这些整数的和。
函数原型
int Sum(int number);
说明:参数 number 为整数的数量。此函数从键盘输入 number 个整数,函数值是这些整数的和。
裁判程序
#include
int Sum(int number);
int main()
{
int n, x, s;
scanf("%d", &n);
s = Sum(n);
printf("%d\n", s);
return 0;
}
/* 你提交的代码将被嵌在这里 */
输入样例1
0
输出样例1
0
输入样例2
5
8 -1 3 6 -9
输出样例2
7
要求:不要使用循环语句。
int Sum(int number){
int a;
if(number<=0){
return 0;
}
else{
scanf("%d",&a);
return a+Sum(number-1);
}
}
所谓自守数(也称守形数),是指其平方数的低位部分恰为该数本身的自然数。例如:25
2
=625, 因此 25 是自守数。其中:0 和 1 也算自守数。
请编写函数,输出指定范围内的所有自守数。
函数原型
void FindAtmp(long long lower, long long upper);
说明:参数 lower 和 upper 分别为整数区间的下限和上限。若在该范围内存在自守数,则输出这些自守数,否则输出“None”。
要求:不要使用循环语句。
提示:需要增加自用的内部函数。
裁判程序
#include
#define Sqr(x) ...(略)...
int IsAtmp(long long x);
void FindAtmp(long long lower, long long upper);
int main()
{
long long a, b;
scanf("%lld%lld", &a, &b);
FindAtmp(a, b);
return 0;
}
......
/* 你提交的代码将被嵌在这里 */
输入样例1
10 80
输出样例1
25
76
输入样例2
400 600
输出样例2
None
本题要求实现一个求非负整数的逆序数的简单函数,建议用递归实现。
函数接口定义:
unsigned int reverse( unsigned int number );
其中 number是用户传入的参数, number 的值不超过unsigned int的范围;函数须返回用户传入的非负整数number的逆序数,建议用递归实现。
裁判测试程序样例:
#include
# include
unsigned int reverse( unsigned int number );
int main()
{
unsigned int n;
scanf("%u", &n);
printf("%u\n", reverse(n));
return 0;
}
/* 请在这里填写答案 */
输入样例:
12340
输出样例:
4321
unsigned int reverse( unsigned int number ){
int n=0;
while(number){
n=10*n+number%10;
number=number/10;
}
return n;
}
请编写函数,考虑误差因素的情况下实现实数的比较。
由于计算机中的实数存在误差问题,因此判断两个实数“相等”时要考虑误差因素。暂且规定:当两个实数之差的绝对值小于指定的精度时,就认为它们“相等”,否则就认为它们“不等”。
函数原型
int RealGt(double x, double y);
int RealGe(double x, double y);
int RealLt(double x, double y);
int RealLe(double x, double y);
int RealEq(double x, double y);
int RealNe(double x, double y);
说明:参数 x 和 y 为两个实数。
若 x 大于 y,则 RealGt 函数值为 1(真),否则为 0(假);
若 x 大于等于 y,则 RealGe 函数值为 1(真),否则为 0(假);
若 x 小于 y,则 RealLt 函数值为 1(真),否则为 0(假);
若 x 小于等于 y,则 RealLe 函数值为 1(真),否则为 0(假);
若 x 等于 y,则 RealEq 函数值为 1(真),否则为 0(假);
若 x 不等于 y,则 RealNe 函数值为 1(真),否则为 0(假)。
在头文件“Real.h”中添加函数声明,在程序文件“Real.c”中编写函数。
Real.h
#ifndef _Real_h_
#define _Real_h_
...(略)...
int RealGt(double x, double y);
int RealGe(double x, double y);
int RealLt(double x, double y);
int RealLe(double x, double y);
int RealEq(double x, double y);
int RealNe(double x, double y);
#endif
Real.c
#include
#include
#include "Real.h"
...(略)...
/* 你提交的代码将被嵌在这里*/
打开程序文件“main.c”,修改主函数,对以上函数进行测试。
main.c
#include
#include "Real.h"
int main()
{
double a, b, c, d;
RealInput(&a);
RealInput(&b);
c = Revise(a + b);
RealInput(&d);
if (RealGt(c, d))
{
puts("c > d");
}
if (RealGe(c, d))
{
puts("c >= d");
}
if (RealLt(c, d))
{
puts("c < d");
}
if (RealLe(c, d))
{
puts("c <= d");
}
if (RealEq(c, d))
{
puts("c == d");
}
if (RealNe(c, d))
{
puts("c != d");
}
return 0;
}
输入样例1
0.3 0.6
0.9
输出样例1
c >= d
c <= d
c == d
输入样例2
0.4 0.5
0.8
输出样例2
c > d
c >= d
c != d
输入样例3
0.2 0.3
0.6
输出样例3
c < d
c <= d
c != d
int RealGt(double x, double y){
if(x>y){
return 1;
}
else{
return 0;
}
}
int RealGe(double x, double y){
if(x>=y){
return 1;
}
else{
return 0;
}
}
int RealLt(double x, double y){
if(x<y){
return 1;
}
else{
return 0;
}
}
int RealLe(double x, double y){
if(x<=y){
return 1;
}
else{
return 0;
}
}
int RealEq(double x, double y){
if(x==y){
return 1;
}
else{
return 0;
}
}
int RealNe(double x, double y){
if(x!=y){
return 1;
}
else{
return 0;
}
}
请编写函数,求两个整数的最大公约数。
函数原型
int Gcd(int x, int y);
说明:参数 x 和 y 是两个任意整数(包括正整数、零和负整数),函数值为最大公约数。
注:最大公约数要求为正整数。当 x=y=0 时,最大公约数规定为 1。
在“Integer.h”中添加函数声明,在“Integer.c”中添加函数定义。打开“main.c”,修改主函数,对以上函数进行测试。
int main()
{
int a, b, c;
scanf("%d%d", &a, &b);
c = Gcd(a, b);
printf("%d\n", c);
return 0;
}
输入样例1
-60 72
输出样例1
12
输入样例2
0 0
输出样例2
1
int Gcd(int x, int y){
int t;
if(x==0&&y==0){
return 1;
}
if(x<0){
x=-x;
}
if(y<0){
y=-y;
}
if(x<0&&y<0){
x=-x;
y=-y;
}
if(y>x){
t=x;
x=y;
y=t;
}
while(y!=0){
x=x%y;
if(y>x){
t=x;
x=y;
y=t;
}
}
return x;
}
请编写函数,求两个整数的最大值。
函数原型
int IntMax(int x, int y);
说明:参数 x 和 y 是两个任意整数,函数值为其中较大者。
在项目中创建头文件“Integer.h”和源程序文件“Integer.c”。在头文件“Integer.h”中声明函数,在源程序文件“Integer.c”中编写函数。
Integer.h
#ifndef _Integer_h_
#define _Integer_h_
#include
int IntMax(int x, int y);
#endif
Integer.c
#include
#include "Integer.h"
/* 你提交的代码将被嵌在这里 */
打开程序文件“main.c”,修改主函数,对以上函数进行测试。
main.c
#include
#include "Integer.h"
int main()
{
int a, b, c;
scanf("%d%d", &a, &b);
c = IntMax(a, b);
printf("%d\n", c);
return 0;
}
对整个项目进行编译、连接,运行程序,检查运行结果是否正确。
输入样例
60 72
输出样例
72
int IntMax(int x, int y){
int max;
max=x;
if(max<y){
max=y;
}
return max;
}
用函数实现求求 a + aa + aaa + aa…a(n 个 a)之和。
函数接口定义:
int fun(int a,int n);
裁判测试程序样例:
在这里给出函数被调用进行测试的例子。例如:
#include
int fun(int a,int n);
int main()
{
int a,n;
scanf("%d %d",&a,&n);
printf("%d", fun(a,n));
return 0;
}
/* 请在这里填写答案 */
输入样例:
在这里给出一组输入。例如:
2 3
输出样例:
在这里给出相应的输出。例如:
246
int fun(int a,int n){
int sum=0,t;
t=a;
for(int i=1;i<=n;i++){
sum+=t;
t=t*10+a;
}
return sum;
}
输入一个三位数,判断其是否是水仙花数。
函数接口定义:
int fun ( int x);
裁判测试程序样例:
#include
int fun ( int n);
int main()
{
int n;
scanf("%d ", &n);
if(fun(n))
printf("%d是水仙花数\n",n);
else
printf("%d不是水仙花数\n",n);
return 0;
}
/* 请在这里填写答案 */
输入样例:
在这里给出一组输入。例如:
153
输出样例:
在这里给出相应的输出。例如:
153是水仙花数
int fun ( int x){
int a,b,c;
a=x/100;
b=x%100/10;
c=x%10;
if(a*a*a+b*b*b+c*c*c==x){
return 1;
}
else{
return 0;
}
}
请编写一个函数double CalCircle(double r),输入一个圆半径r,当r>=0时,计算并输出圆的面积和周长,否则,输出提示信息。
函数接口定义:
void CalCircle(double r);
r用来存放输入的半径
裁判测试程序样例:
在这里给出函数被调用进行测试的例子。例如:
#include
#define PI 3.1415926
void CalCircle(double r);
int main(int argc, char *argv[]) {
double r;
printf("please input circle r:");
scanf("%lf",&r);
CalCircle(r);
return 0;
}
/* 请在这里填写答案 */
输入样例:
在这里给出一组输入。例如:
1
输出样例:
在这里给出相应的输出。例如:
circle area is:3.142, and the length is:6.283
输入样例:
在这里给出一组输入。例如:
-1
输出样例:
在这里给出相应的输出。例如:
circle r is invalid!
void CalCircle(double r){
double c,s;
if(r>=0){
printf("circle area is:%d,and the length is:%d",2*PI*r,PI*r*r);
}
else{
printf("circle r is invalid!");
}
}
请编写一个函数char CalFun(int x),从键盘上输入一个百分制成绩score,按下列原则输出其等级:score≥90,等级为A;80≤score<90,等级为B;70≤score<80,等级为C;60≤score<70,等级为D;score<60,等级为E。
函数接口定义:
char CalFun(int x);
x为输入的分数,返回等级信息
裁判测试程序样例:
#include
char CalFun(int x);
int main(int argc, char *argv[]) {
int x;
printf("please input score:");
scanf("%d",&x);
printf("grade is:%c",CalFun(x));
return 0;
}
/* 请在这里填写答案 */
输入样例:
在这里给出一组输入。例如:
95
输出样例:
在这里给出相应的输出。例如:
grade is:A
输入样例:
在这里给出一组输入。例如:
86
输出样例:
在这里给出相应的输出。例如:
grade is:B
输入样例:
在这里给出一组输入。例如:
55
输出样例:
在这里给出相应的输出。例如:
grade is:E
char CalFun(int x){
switch(x/10){
case 10:
case 9:printf("grade is:A\n");break;
case 8:printf("grade is:B\n");break;
case 7:printf("grade is:C\n");break;
case 6:printf("grade is:D\n");break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:printf("grade is:E\n");break;
}
}