【PTA】【C语言】复盘练习——函数题

目录

R6-1 最大公约数-递归

函数接口定义:

裁判测试程序样例:

输入样例:

输出样例:

R6-2 猴子吃桃-递归

函数接口定义:

裁判测试程序样例:

输入样例:

输出样例:

R6-3 奇妙的定律-递归

函数接口定义:

裁判测试程序样例:

输入样例:

输出样例:

R6-4 删除单链表的第i个结点。

函数接口定义:

裁判测试程序样例:

输入样例1:

输出样例1:

输入样例2:

输出样例2:

R6-5 链表-查找链表最后节点

函数接口定义:

裁判测试程序样例:

输入样例:

输出样例:

R6-6 链表逆序

函数接口定义:

裁判测试程序样例:

输入样例:

输出样例:

R6-7 结构体-查找最低分学生记录

函数接口定义:

裁判测试程序样例:

输入样例:

输出样例:

R6-8 结构体-查找同学信息

函数接口定义:

裁判测试程序样例:

输入样例:

输出样例:

R6-9 逆序输出字符串

函数接口定义:

裁判测试程序样例:

输入样例:

输出样例:

R6-10 求整数区间[a,b]中偶数之和

函数接口定义:

裁判测试程序样例:

输入样例:

输出样例:

R6-11 阶乘计算

函数接口定义:

裁判测试程序样例:

输入样例:

输出样例:

R6-12 求10×10方阵主副对角线元素之和

要求:

函数接口定义:

裁判测试程序样例:

输入样例:

输出样例:

R6-13 输入多个单词,统计以指定字母开头的单词个数

函数接口定义:

裁判测试程序样例:

输入样例:

输出样例:

R6-14 求等差数列前n项和

函数接口定义:

裁判测试程序样例:

输入说明:

输入样例:

输出样例:

R6-15 找一维数组中大于某个数的最小值

函数接口定义:

裁判测试程序样例:

输入样例:

输出样例:


R6-1 最大公约数-递归

输入两个正整数输出两个数的最大公约数,用递归函数实现。

函数接口定义:

int gcd (int a, int b);

请用递归形式完成上面函数,该函数返回a和b的最大公约数。

裁判测试程序样例:

int gcd (int a, int b);
int main()
{
    int m, n;
    scanf("%d%d",&m,&n);
    printf("%d\n",gcd(m,n));
    return 0;
}
/* 请在这里填写答案 */

输入样例:

4 6

输出样例:

2

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

代码如下:

int gcd (int a, int b)
{
    int t = b;
    if (b == 0)
        return a;
    b = a % b;
    a = t;
    return gcd(a, b);
}

R6-2 猴子吃桃-递归

小猴子第一天摘下桃子若干,当即吃掉一半,还不过瘾,又多吃一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?。
请通过递归形式实现。

函数接口定义:

int Peach(int day);

该函数返回第day天所剩的桃子。用递归实现。

裁判测试程序样例:

#include 
int n;
int Peach(int day);
int main ()
{
    scanf("%d", &n);
    printf("%d\n", Peach(1));
    return 0;
}

/* 请在这里填写答案 */

输入样例:

3

输出样例:

10

代码长度限制        16 KB

时间限制        400 ms

内存限制        64 MB

代码如下:

int Peach(int day)
{
    int sum = 0;
	if(day == n) 
        sum += 1;
	else if(day < n)
        sum += 2*(Peach(day+1)+1);
	return sum;
}

R6-3 奇妙的定律-递归

小明偶然间发现一个奇妙的定律,任何一个自然数,如果是偶数,就除以2,如果是奇数,就乘以3再加1。最后,经过若干次迭代得到1。也就是说,不管怎样迭代,不断除以2以后,最后是1。现在给你一个自然数n,求出它转变为1所经过的所有过程。
用递归函数实现。

函数接口定义:

void F(int n);

该函数输出由n变为1所经过的所有过程。用递归实现。

裁判测试程序样例:


#include 
void F(int n);
int main()
{
    int n;
    scanf("%d", &n);
    F(n);
    return 0;
}
/* 请在这里填写答案 */

 代码如下:


#include 
void F(int n);
int main()
{
    int n;
    scanf("%d", &n);
    F(n);
    return 0;
}
/* 请在这里填写答案 */

输入样例:

22

输出样例:

两个数之间空格隔开,最后一个数后面没有空格:

22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

代码长度限制        16 KB

时间限制        400 ms

内存限制        64 MB

代码如下:

void F(int n)
{
    printf("%d", n);
    if (n != 1)
        printf(" ");
	int i = n;
	while(i != 1) 
    {
		if(i % 2 == 0 && i >= 0)
        {	
			i = i / 2;
			printf("%d", i);
		}
		else if(i % 2 != 0 && i >= 0)
        {
			i = i * 3 + 1;
			printf("%d", i);
		}
        if (i != 1)
            printf(" ");
	}
 } 

R6-4 删除单链表的第i个结点。

本题要求实现一个函数,删除单链表的第i个结点。

函数接口定义:

Node *deletelink(Node *head, int i)

在这里,head是单链表的头指针,i是待删除的结点编号。函数不需要处理单链表为空的情况。如果删除位置错误,输出"error"。

裁判测试程序样例:

#include 
#include 
#include 

typedef struct ListNode {
    int num;
    struct ListNode *next;
}Node;

Node *createlist(); /*根据用户输入的整数n,创建具有n个结点的单链表。裁判实现,细节不表*/
Node *deletelink(Node *head, int i);
void display(Node *head);/*输出链表结点的数据域。裁判实现,细节不表*/

int main(void)
{
    Node  *head;
     int i;
    head = createlist();
     scanf("%d",&i);
    head = deletelink(head, i);
    display(head);
    return 0;
}

/* 请在这里填写答案 */

输入样例1:

5
10 5 4 8 7
2

输出样例1:

10 4 8 7

输入样例2:

5
10 5 4 8 7
6

输出样例2:

error
10 5 4 8 7

代码长度限制        16 KB

时间限制        400 ms

内存限制        64 MB

代码如下:

Node *deletelink(Node *head, int i)
{
    Node *p, *s;
    int count = 1;
    p = head;
    if (i == 1)
    {
        head = p -> next;
        return head;
    }
    while (p -> next != NULL && count < i)
	{
		s = p;
		p = p -> next;
        count++;
    }
    if (count < i)
    {
        printf("error\n");
        return head;
    }
    else
    {
 
        s -> next = p -> next;
        free(p);
    }
    return head;
}

R6-5 链表-查找链表最后节点

题目:查找链表最后节点

struct node
{int ch;
struct node * next;};

由上面类型节点组成的有头节点的单链表,

定义函数遍历链表,返回链表上最后一个节点的数据成员ch的值。

函数接口定义:

在这里描述函数接口。例如:
int  findnode(struct node *head);

head是链表的头指针,返回值是最后节点数据成员ch的值。

裁判测试程序样例:

在这里给出函数被调用进行测试的例子。例如:


#include 
#include
struct  node
{int ch;
struct node * next;}; 
struct node *setlink(int N);  //建链表函数,已经定义

int findnode(struct node * head);//在下边代码区定义此函数

int main()
{
int N;
struct node *head; 
scanf("%d",&N); 
head=setlink(N);
printf("%d", findnode(head));
return 0;
}

/* 请在这里填写答案 */

输入样例:

在这里给出一组输入。例如:

6
3 1 2 7 4 5

输出样例:

在这里给出相应的输出。例如:

5

代码长度限制        16 KB

时间限制        400 ms

内存限制        64 MB

代码如下:

int  findnode(struct node *head)
{
    struct node *p, *s;
	p = head;
	while (p != NULL)
	{
        s = p;
		p = p -> next;
	}
    return s -> ch;
}

R6-6 链表逆序

程序实现了一个单链表的逆序。请完成函数list_reverse()。

函数接口定义:

Node* list_reverse(Node* head)

head是单链表的头指针,函数返回逆序后的头指针。

裁判测试程序样例:

#include 
#include 
#include 

typedef struct ListNode {
    int num;
    struct ListNode *next;
}Node;

Node *createlist();/*根据用户输入的整数n,创建具有n个结点的单链表。裁判实现,细节不表*/
Node* list_reverse(Node* head);
void display(Node *head);/*输出链表结点的数据域。裁判实现,细节不表*/

int main(void)
{
    Node  *head,*p;
    head = createlist();    
    head = list_reverse(head);
    display(head);
    return 0;
}

/* 请在这里填写答案 */

输入样例:

5
1 2 3 4 5

输出样例:

在这里给出相应的输出。例如:

5 4 3 2 1

代码长度限制        16 KB

时间限制        400 ms

内存限制        64 MB

代码如下 :

Node* list_reverse(Node* head)
{
    if(head == NULL || head->next == NULL)
        return head;
    Node *p = list_reverse(head->next);    //进入递归
    head->next->next = head;
    head->next = NULL;    //封口,避免了链表存在环
    return p;
}

R6-7 结构体-查找最低分学生记录

struct student

{

int num ;

char name[20];

int score;};

typedef struct student stu;

有上面面学生记录类型定义,
定义函数在一组学生记录中找成绩最低的学生信息,
最低分唯一

函数接口定义:

stu fun( stu  a[] )

数组a里存储N个学生记录,返回值是最低分记录

裁判测试程序样例:

在这里给出函数被调用进行测试的例子。例如:
#include 
#define N  10
stu fun( stu  a[] );

int main()
{
    stu a[N], min;
    int i;
    for (i=0;i

输入样例:

在这里给出一组输入。例如:

1 a01 62
2 a02 56
3 a03 77
4 aaa 66
5 bbb 78
11 a01 62
12 a02 57
13 a03 77
14 aaa 96
15 bbb 78

输出样例:

在这里给出相应的输出。例如:

2 a02 56

代码长度限制        16 KB

时间限制        400 ms

内存限制        64 MB

代码如下:

stu fun( stu  a[] )
{
    stu b;
    int i, min = 999;
    //min = a[0].score;
    for(i = 0; i < N; i++)
    {
        if(min > a[i].score)
        {
            min = a[i].score;
            b = a[i];
        }
    }
    return b;
}

R6-8 结构体-查找同学信息

定义函数处理存储学生成绩信息的结构体数组,按姓名查找,找到返回成绩,没找到返回-1.

函数接口定义:

int fun(struct stu *p, int n,char *sname);
结构体定义如下:
struct stu
{ int num; 
char name[20];
int score; };

p是结构体数组起始地址,n是结构体单元个数,
sname是查找的姓名。
结构体三个成员分别是:学号,姓名,成绩。

裁判测试程序样例:

#include 
#include
struct stu{
    int num;
    char name[20];
    int score;
};
int fun( struct stu *p, int n,char *sname );
int main()
{   struct stu a[20];
    int n, i;
    char str[20];
    scanf("%d", &n);
    for(i = 0; i < n; i++){
       scanf("%d%s%d", &a[i].num, a[i].name, &a[i].score);
    } 
   scanf("%s",str);
   printf("%d",fun(a,n,str));
    return 0;
}
/* 请在这里填写答案 */

输入样例:

在这里给出一组输入。例如:

6
1001 anny 85
1002 boy 75
1003 car 65
1004 dan 55
1005 emm 95
1006 pa 35
boy

输出样例:

在这里给出相应的输出。例如:

75

代码长度限制        16 KB

时间限制        400 ms

内存限制        64 MB

代码如下:

int fun(struct stu *p, int n,char *sname)
{
    int i;
    for (i - 0; i < n; i++)
    {
        if (strcmp(p[i].name, sname) == 0)
            return p[i].score;
    }
    return -1;
}

R6-9 逆序输出字符串

编写一个递归函数 displayStringReverse,逆序输出一个字符串的所有元素。

函数接口定义:

void displayStringReverse(char *s);

其中 是用户传入的参数。 指向一个以‘\0'结束的字符串第一个字符。

裁判测试程序样例:

#include 

void displayStringReverse(char *s);

int main(void)
{
    char s[30];
    gets(s);
    displayStringReverse(s);
    return 0;
}
/* 请在这里填写答案 */

输入样例:

Hello world!

输出样例:

!dlrow olleH

代码长度限制        16 KB

时间限制        400 ms

内存限制        64 MB

代码如下:

void displayStringReverse(char *s)
{
    if(*s!='\0')
	{
		displayStringReverse(s+1);
		printf("%c",*s);	
	}
}

R6-10 求整数区间[a,b]中偶数之和

编写函数,求给定整数区间[a,b]中偶数之和。

函数接口定义:

在这里描述函数接口。例如:
int sumEven(int begin, int end);

参数begin是整数区间的左边界, end是整数区间的右边界,函数的值是该区间所有偶数之和。

裁判测试程序样例:

在这里给出函数被调用进行测试的例子。例如:
#include 

/* 你编写的函数将嵌入在这里 */

int main()
{
    int a,b;
    scanf("%d%d",&a,&b);
    printf("SumEven = %d\n",sumEven(a,b));
    return 0;
}

输入样例:

在这里给出一组输入。例如:

1 10

输出样例:

在这里给出相应的输出。例如:

SumEven = 30

代码长度限制        16 KB

时间限制        400 ms

内存限制        64 MB

代码如下:

int sumEven(int begin, int end)
{
    int sum = 0;
    for (int i = begin; i <= end; i++)
    {
        if (i % 2 == 0)
            sum += i;
    }
    return sum;
}

R6-11 阶乘计算

程序的功能是:求S=1/1!+1/2!+1/3!+…+1/N!并输出结果。N为任意自然数(只考虑int型),从键盘读入

函数接口定义:

double fac();

double fac();计算阶乘,函数需要使用static 局部变量

裁判测试程序样例:

#include 
double fac();
int main(void)
{
    int i, n;
    double Sum = 0;
    scanf("%d", &n);
    for (i=1; i<=n; i++)
    {
        Sum += 1 / fac();
    }

    printf("S=1/1!+1/2!+...+1/%d!=%.15f", n, Sum);
    return 0;
}

/* 请在这里填写答案 */

输入样例:

在这里给出一组输入。例如:

16

输出样例:

在这里给出相应的输出。例如:

S=1/1!+1/2!+...+1/16!=1.718281828459042

代码长度限制        16 KB

时间限制        400 ms

内存限制        64 MB

代码如下:

double fac()
{
    static n = 1;
    double sum = 1, i;
    for (i = 1; i <= n; i ++)
    {
        sum *= i;
    }
    n++;
    return sum;
}

R6-12 求10×10方阵主副对角线元素之和

给定一个10×10的方阵,本题要求计算该方阵主对角线和副对角线所有元素之和。主对角线为从方阵的左上角至右下角的连线,副对角线为从方阵的右上到左下角的连线。

要求:

编写函数按照题意计算元素之和。

函数接口定义:

int sumMatrix(int (*a)[10]);  

指针a指向了一个10×10的方阵

裁判测试程序样例:

#include
#define N 10

/* 请在这里填写答案 */

void createMatrix(int (*a)[N])//从键盘读入方阵中的数据
{
    for(int i=0; i

输入样例:

1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10

输出样例:

110

代码长度限制        16 KB

时间限制        400 ms

内存限制        64 MB

代码如下:

int sumMatrix(int (*a)[10])
{
    int sum = 0, i, j, x1 = 0, y1 = 0, x2 = 9, y2 = 9;
    for (i = 0; i < 10; i++)
    {
        for (j = 0; j < 10; j++)
        {
            if (i == j || j == 9 - i)
                sum += a[i][j];
        }
    }
    return sum;
}

R6-13 输入多个单词,统计以指定字母开头的单词个数

本题目:先输入一个含有多个单词的字符串,然后再输入一个字母,然后调用函数getWordNum统计该行字符中以指定字母开始的单词的个数(不区分大小写)。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。

函数接口定义:

int getWordNum(char ar1[], char ch) ;

函数返回以形参变量ch中的字符开头的字符数组ar1中的单词数

裁判测试程序样例:

#include
int getWordNum(char ar1[],char ch) ;
int main()
{ 
    char string[81],c,n; 
    gets(string);                           
    c=getchar();
    n=getWordNum(string,c);
    printf("%d",n); 
    return 0;
}

/* 请在这里填写答案 */

输入样例:

在这里给出一组输入。例如:

af Adf Dad abdde
a

输出样例:

在这里给出相应的输出。例如:

3

代码长度限制        16 KB

时间限制        400 ms

内存限制        64 MB

代码如下:

int getWordNum(char ar1[], char ch)
{
    char *p;
    int flag = 0, count = 0;
    p = ar1;
    while(*p != '\0')
    {
        if (*p != ' ' && flag == 0)
        {
            flag = 1;
            if (*p >= 'a' && *p <= 'z' || *p >= 'A' && *p <= 'Z')
            {
                if (*p == ch || *p == ch - 32 || *p == ch + 32)
                    count++;
            }
        }
        if(*p == ' ' && flag == 1)
            flag=0;
        p++;
    }
    return count;
}

R6-14 求等差数列前n项和

设 a0​,a1​,⋯an​为一个等差数列的前n项,请编写函数求其前n项和sum=a0​+a1​+⋯+an​。
说明:数列下标从0开始计数。

函数接口定义:

double SumArithmetic(double start, double diff ,int index);

参数start为首项的值,diff为公差,index为通项索引号(从0开始计数)。函数值为第 index 项的值。

裁判测试程序样例:

#include 

/* 你编写的函数将嵌入在这里 */

int main()
{
    double h,r;     //h首项,r公差
    int n;          //n通项索引
    scanf("%lf%lf%d",&h,&r,&n);
    printf("%G\n",SumArithmetic(h,r,n));
    return 0;
}

输入说明:

在一行输入3个实数,分别是首项、公差和数列的项数,数与数之间用1个空格隔开。

输入样例:

3.2 1.2 7

输出样例:

59.2

代码长度限制        16 KB

时间限制        400 ms

内存限制        64 MB

代码如下:

double SumArithmetic(double start, double diff ,int index)
{
    double sum = 0, end = start + diff * index;
    sum = (start + end) * (index + 1) / 2;
    return sum;
}

R6-15 找一维数组中大于某个数的最小值

程序的功能是:从键盘读入N个数到arrA中,再读入一个数num(这些数均≥0),然后调用自定义函数在数组arrA中查找大于num的最小数、输出查找结果,如果未找到,提示“not found”。本题要求实现自定义函数。

函数接口定义:

int findOverNum(int *p,int count,int num);

其中 p 、 count 、num分别用来存放数组的起始地址、待处理的数组元素个数、要查找的基准数据。 函数须返回数组中大与num的最小数。

裁判测试程序样例:

#include 
#define N 8
int findOverNum(int *p,int count,int num);

int main(void)
{
    int arrA[N], num, minA ;
    int i,t;
    for(i=0;i

输入样例:

88 11 33 77 22 55 95 66
51

输出样例:

55

代码长度限制        16 KB

时间限制        400 ms

内存限制        64 MB

代码如下:

int findOverNum(int *p,int count,int num)
{
    int a = 999, i, flag = 0;
    for (i = 0; i < count; i++)
    {
        if (p[i] > num && p[i] < a)
        {
            a = p[i];
            flag = 1;
        }
    }
    if (flag == 1)
        return a;
    return -1;
}

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