目录
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 找一维数组中大于某个数的最小值
函数接口定义:
裁判测试程序样例:
输入样例:
输出样例:
输入两个正整数输出两个数的最大公约数,用递归函数实现。
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);
}
小猴子第一天摘下桃子若干,当即吃掉一半,还不过瘾,又多吃一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第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;
}
小明偶然间发现一个奇妙的定律,任何一个自然数,如果是偶数,就除以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(" ");
}
}
本题要求实现一个函数,删除单链表的第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;
}
/* 请在这里填写答案 */
5
10 5 4 8 7
2
10 4 8 7
5
10 5 4 8 7
6
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;
}
题目:查找链表最后节点
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;
}
程序实现了一个单链表的逆序。请完成函数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;
}
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;
}
定义函数处理存储学生成绩信息的结构体数组,按姓名查找,找到返回成绩,没找到返回-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;
}
编写一个递归函数 displayStringReverse,逆序输出一个字符串的所有元素。
void displayStringReverse(char *s);
其中 s
是用户传入的参数。 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);
}
}
编写函数,求给定整数区间[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;
}
程序的功能是:求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;
}
给定一个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;
}
本题目:先输入一个含有多个单词的字符串,然后再输入一个字母,然后调用函数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;
}
设 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;
}
程序的功能是:从键盘读入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;
}