博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PTA C语言实训(周三)
阅读量:2055 次
发布时间:2019-04-28

本文共 8697 字,大约阅读时间需要 28 分钟。

文章目录

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
在这里插入图片描述

double Cmb(int x, int y){
double m; if(x<0||y<0||x
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

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

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.1415926void 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; }}

转载地址:http://xjnlf.baihongyu.com/

你可能感兴趣的文章
如何分析SQL语句
查看>>
结构化查询语言(SQL)原理
查看>>
SQL教程之嵌套SELECT语句
查看>>
几个简单的SQL例子
查看>>
日本語の記号の読み方
查看>>
计算机英语编程中一些单词
查看>>
JavaScript 经典例子
查看>>
判断数据的JS代码
查看>>
js按键事件说明
查看>>
AJAX 初次体验!推荐刚学看这个满好的!
查看>>
AJAX 设计制作 在公司弄的 非得要做出这个养的 真晕!
查看>>
AJAX 自己研究玩的
查看>>
javascript(js)数组操作
查看>>
用JavaScript脚本实现Web页面信息交互
查看>>
window 窗口对象操作
查看>>
公司一位老员工愤然离去的留信!崩溃!
查看>>
C#技巧:网页表单自动填写技术(以gmail为例)
查看>>
C#基础概念二十五问
查看>>
C#在Excel中将连续多列相同数据项合并
查看>>
C#如何把html中的相对路径变成绝对路径
查看>>