翻转课堂习题讲解安排

翻转课堂习题讲解安排如下

翻转课堂习题讲解安排
序号 组别 组员 主题
2 22-2 芦英豪,陈爔睿,甄曦,陈敬尧 删除孪生素数
4 22-4 陈澍,徐弘仰,姚吉顺,何远超 单词简写
7 23-2 张远霖,李想,王振浩,刘鉴鉴 骑行总路程
10 23-5 郑特,王佳伟,任学斌,张凯博 连续退步最大次数
11 23-6 高小峰,张越,彭鑫茂,吕先启 分组问题
14 23-9 黄海涛,刘源,朱海,周舒 删除0
15 23-10 王翔,翟腾宇,李嘉豪,李炘璘 买饮料
16 23-11 焦军洁,朱峻浩,何添龙,龙凌川 查找共同前缀
Tip

点击右侧目录快速到达题目

删除孪生素数

下面有结构类型node的定义,指针head中存放着node节点组成的单向链表的首节点地址。函数node* deleteTwin(node* head, int t)的功能是将head所指向的链表中素数t对应的孪生素数删除,并返回新链表。孪生素数就是指相差2的素数对,例如3和5,5和7,11和13

说明:题目所给数据中,链表已有节点的数和t都是素数,即无需判断是否为素数。

输入格式:

输入的第一行包含一个整数n和n个素数(n>=0),分别表示给定的链表的长度和链表所包含的n个素数。

输入的第二行包含一个整数k和k个素数(k>=1),分别表示待处理的素数的个数和待处理的k个素数。

输出格式:

输出为删除所有给定素数的孪生素数之后的链表。

输入样例:

5 2 3 5 11 17
2 7 13

输出样例:

2->3->17
初始代码
#include <iostream>
using namespace std;
struct node {
    int data;
    node* next;
};
node* deleteTwin(node* head, int t) 
{
    /********Program********/
    /********  End  ********/
}
void output(node* head);
int main()
{
    int n;
    cin >> n;
    node* head = NULL, * cur = NULL, * tmp;
    for (int i = 0; i < n; i++)
    {
        tmp = new node;
        cin >> tmp->data;
        tmp->next = NULL;
        if (head == NULL) {
            head = tmp;
            cur = head;
        }
        else {
            cur->next = tmp;
            cur = cur->next;
        }
    }
    int k, t;
    cin >> k;
    for (int i = 0; i < k; i++)
    {
        cin >> t;
        head = deleteTwin(head, t);
    }
    output(head);
    return 0;
}
void output(node* head) {
    while (head)
    {
        cout << head->data;
        head = head->next;
        if (head) cout << "->";
    }
    cout << endl;
}

单词简写

给定一个复合词,该复合词的简写是将复合词中所有单词的首字母大写后再连接在一起。例如,复合词”artificial intelligence”的简写为”AI”,“express mail service”的简写为”EMS”,“People’s Liberation Army”简写为”PLA”。

请完成函数void Abbreviate(char compoundWord[], char abbrWord[]),计算复合词compoundWord的简写,并将其存在abbrWord中。

提示:strlen(char str[])函数可以返回str中所存储字符串的长度。

输入格式:

输入在一行中给出一个字符串,表示复合词,复合词的长度小于100,复合词中的单词个数大于等于2且小于10,复合词中的单词之间以1个空格分隔。

输出格式:

输出一行表示该复合词对应的简写。

输入样例:

express mail service

输出样例:

EMS
初始代码
#include <iostream>
#include <cstring>
using namespace std;
void Abbreviate(char compoundWord[], char abbrWord[])
{
/********Program********/
/********  End  ********/
}
int main()
{
    char compoundWord[110], abbrWord[20];
    cin.getline(compoundWord, 110);
    Abbreviate(compoundWord, abbrWord);
    cout << abbrWord << endl;
    return 0;
} 

骑行总路程

小明周一至周五每天骑行250公里,周六周日不骑行。假设从周x(其中1<=x<=7,周1-周7分别代表周一至周日)开始算起,过了n天以后,问小明一共累计骑行了多少公里?

请完成下面的函数int calc(int x, int n),函数返回小明的骑行总路程。

输入格式:

输入包含两个整数 x, n,其中,周x表示周几,n天表示过了n天。

输出格式:

针对输入,打印出一个整数,表示小明累计骑行了多少公里。

输入样例:

3 10

输出样例:

2000
初始代码
#include <iostream>
using namespace std;
int calc(int x, int n) 
{
    /********Program********/
    /********  End  ********/
}
int main()
{
    unsigned long long n,ans=0; 
    int x;
    cin >> x >> n; 
    ans = calc(x, n);
    cout << ans; 
    return 0;
}

连续退步最大次数

为统计小明考试成绩退步的情况,请实现函数int getMaxRetrogressCount(int scores[], int n),该函数功能是统计小明n次考试中分数连续降低的最大次数

参数说明:

在数组scores中传入所有考试的分数,n为考试总次数(n>1)。例如:小明考试6次的成绩分别为 50、72、65、94、93、90分数连续降低的最大情况是94、93、90,所以连续退步最大次数是2。

输入样例:

输入10次考试的成绩,各个成绩用空格进行分隔,例如

50 34 44 60 50 48 36 36 32 62

输出样例:

输出10次考试的连续退步最大次数,例如

3

(对应60 50 48 36这几次的分数,注意后续的36 32这两次不符合题目要求)

初始代码
#include <iostream>
using namespace std;
#define SIZE 10
int getMaxRetrogressCount(int scores[], int n)
{
/********Program********/
/********  End  ********/    
}
int main()
{
    int scores[SIZE] = {0};
    for(int i=0; i<SIZE; i++) {
        cin>>scores[i];
    }
    int ret = getMaxRetrogressCount(scores, SIZE);
    cout << ret << endl;
    return 0;
}

分组问题

把n个不同的球分成m组,要求每组中至少有一个球,有几种不同的分法呢?

请完成函数f(n, m)来计算这个数目。

比如,把3个不同的球(假设编号为 a, b, c)分为2组,有3种不同的分法:

  1. a 单独在一组,b 和 c 分在一组
  2. b 单独在一组,a 和 c 分在一组
  3. c 单独在一组,a 和 b 分在一组

再比如,若m = n = 3,则只有 1 种分组方法,即每组恰有一个球。

特别规定:f(0, 0)=1, 当 n > 0 时,f(n, 0) = 0

提示:求该问题的递归思路——若n<m,则f(n,m)=0;若n==m,则f(n,m)=1;当n>m时,分组可分成两类情况:编号最小的球单独分成一组,其他球分成m-1组;编号最小的球与其他球分在一组。

输入格式:

球的数目n和组数m

输出格式:

在一行中输出f(n,m)的值。

输入样例:

3 2

输出样例:

3
初始代码
#include <iostream>
using namespace std;
unsigned int f(unsigned int n, unsigned int m)
{
/********Program********/
/********  End  ********/
}
int main()
{
  unsigned int n, m;
    cin >> n >> m ;    
    cout << f(n,m)<<endl;
    return 0;
}

删除0

完成函数int calc(int n)的功能,参数n是一个正整数,该函数删除n中所有出现的0并返回删除结果;若n中没有0,则返回原数。

提示:如果需要可以调用pow函数,pow(x, y)表示计算x的y次方。

输入格式:

输入在一行中给出1个正整数,输入给a。

输出格式:

在一行中输出删除0后的数。

输入样例:

123103405

输出样例:

1231345
初始代码
#include <iostream>
#include <cmath>
using namespace std;
int calc(int n)
{
    /********Program********/
    /********  End  ********/
}
int main()
{
    int a;
    cin >> a;
    cout << calc(a) << endl;
    return 0;
}

买饮料

小明最近发了工资,他一口气买了n瓶饮料,他每喝完一瓶饮料就将瓶盖保留起来,k个瓶盖就可以换一瓶新的饮料,那么小明最终能喝到多少瓶饮料呢? 聪明的你可以帮帮小明吗?

请完成下面的函数int calc(int n, int k),函数返回最终能喝到多少瓶饮料。

输入格式:

输入包含两个整数 n(n>=0),k(k>1),含义如题目描述所示,整数之间用一个空格隔开。

输出格式:

打印出小明最终能喝到的饮料瓶数。

输入样例:

5 3

输出样例:

7
初始代码
#include <iostream>
using namespace std;
int calc(int n, int k) 
{
    /********Program********/
    /********  End  ********/
}
int main()
{
    int n, k;
    cin >> n >> k;
    int ans = 0;
    ans = calc(n, k);
    cout << ans << endl;;
    return 0;
}

查找共同前缀

英语单词的前缀构成有一定的规律,例如”incorrect”和”inability”有相同前缀”in”。

请完成C++函数findCommonPrefix(char *word1, char * word2, char *prefix),该函数分析得到word1和word2两个单词的最长共同前缀,分析结果存到参数prefix中(题目保证prefix所指向空间足够大)。例如,“disadvantage”和”disagree”的最长共同前缀是”disa”,“disadvantage”和”misunderstand”的最长共同前缀是空串。

提示:可能用到的字符串函数说明如下

int strlen(char *str);               // 返回字符串str的长度;
char *strcpy(char *dest, char *src); // 把字符串src复制到dest;
char *strcat(char *dest, char *src); // 把字符串src连接到dest后面;
char *strstr(const char *s1, const char *s2); //从s1中查找子串s2第一次出现的位置。

输入格式:

输入在一行中给出两个英文单词(单词内部不含空格等分隔字符),以空格进行分隔。

输出格式:

在一行中输出两个英文单词的最长共同前缀。

输入样例:

disadvantage disagree

输出样例:

disa
初始代码
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
void findCommonPrefix(char *word1, char *word2, char *prefix)
{
/**********Program**********/
/**********  End  **********/
}
int main()
{
    char word1[100], word2[100];
    char prefix[100];
    cin >> word1 >> word2;
    findCommonPrefix(word1, word2, prefix);
    cout << prefix << endl;
    return 0;
}