PTA C语言实训(周三)

文章目录

    • 1.求组合数(高效递归版) (10 分)
    • 2.显示矩形(递归版) (10 分)
    • 3.若干整数求和(递归版) (10 分)
    • 4.寻找自守数(递归版) (10 分)
    • 5.递归求逆序数 (20 分)
    • 6.实数的比较 (10 分)
    • 7.最大公约数 (10 分)
    • 8.最大值 (10 分)
    • 9.用函数实现求求 a + aa + aaa + aa…a(n 个 a)之和。 (10 分)
    • 10.输入一个三位数,判断其是否是水仙花数。 (10 分)
    • 11.计算圆的面积和周长 (5 分)
    • 12.分数分段 (5 分)

1.求组合数(高效递归版) (10 分)

请编写高效递归函数,求组合数。
在这里插入图片描述
函数原型
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;
}

/* 你提交的代码将被嵌在这里 */

输入样例
4 2
输出样例
6
PTA C语言实训(周三)_第1张图片

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

2.显示矩形(递归版) (10 分)

请编写递归函数,显示矩形。

函数原型
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); 
    	}
}

3.若干整数求和(递归版) (10 分)

请编写递归函数,输入若干整数,求这些整数的和。
函数原型
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);
	}
}

4.寻找自守数(递归版) (10 分)

所谓自守数(也称守形数),是指其平方数的低位部分恰为该数本身的自然数。例如: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

5.递归求逆序数 (20 分)

本题要求实现一个求非负整数的逆序数的简单函数,建议用递归实现。

函数接口定义:
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;
}

6.实数的比较 (10 分)

请编写函数,考虑误差因素的情况下实现实数的比较。

由于计算机中的实数存在误差问题,因此判断两个实数“相等”时要考虑误差因素。暂且规定:当两个实数之差的绝对值小于指定的精度时,就认为它们“相等”,否则就认为它们“不等”。
函数原型
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;
	}
}

7.最大公约数 (10 分)

请编写函数,求两个整数的最大公约数。

函数原型
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;
}

8.最大值 (10 分)

请编写函数,求两个整数的最大值。

函数原型
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;
}

9.用函数实现求求 a + aa + aaa + aa…a(n 个 a)之和。 (10 分)

用函数实现求求 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;
}

10.输入一个三位数,判断其是否是水仙花数。 (10 分)

输入一个三位数,判断其是否是水仙花数。

函数接口定义:
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;
	}
}

11.计算圆的面积和周长 (5 分)

请编写一个函数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!");
	}	
}

12.分数分段 (5 分)

请编写一个函数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;
	}
}

你可能感兴趣的:(C语言,c语言)