一、实操题
1、乒乓球(Table.pas)
【问题背景】国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白11分制和21分制对选手的不同影响。在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。
【问题描述】华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在11分制和21分制下,双方的比赛结果(截至记录末尾)。
比如现在有这么一份记录,(其中W表示华华获得一分,L表示华华对手获得一分):
WWWWWWWWWWWWWWWWWWWWWWLW
在11分制下,此时比赛的结果是华华第一局11比0获胜,第二局11比0获胜,正在进行第三局,当前比分1比1。而在21分制下,此时比赛结果是华华第一局21比0获胜,正在进行第二局,比分2比1。如果一局比赛刚开始,则此时比分为0比0。
你的程序就是要对于一系列比赛信息的输入(WL形式),输出正确的结果。
【输入格式】每个输入文件包含若干行字符串(每行至多20个字母),字符串有大写的W、L和E组成。其中E表示比赛信息结束,程序应该忽略E之后的所有内容。
【输出格式】输出由两部分组成,每部分有若干行,每一行对应一局比赛的比分(按比赛信息输入顺序)。其中第一部分是11分制下的结果,第二部分是21分制下的结果,两部分之间由一个空行分隔。
【输入样例】
WWWWWWWWWWWWWWWWWWWW
WWLWE
【输出样例】
11:0
11:0
1:1
21:0
2:1
参考答案:br />根据题目要求,编写以下代码实现乒乓球胜负判断并输出结果:```pascalprogram Table;vari, n: integer;str: string;score1, score2: array[1..2] of integer;flag: boolean;beginflag := false;score1[1] := 0; score1[2] := 0;score2[1] := 0; score2[2] := 0;while not(flag) dobeginreadln(str);if str = 'E' thenflag := trueelsebeginn := length(str);for i := 1 to n dobeginif str[i] = 'W' thenbegininc(score1[1]);inc(score2[2]);endelse if str[i] = 'L' thenbegininc(score1[2]);inc(score2[1]);end;end;if score1[1] >= 11 thenbeginwriteln(score1[1]:2, ':', score1[2]:2);score1[1] := 0; score1[2] := 0;end;if score2[1] >= 21 thenbeginwriteln(score2[1]:2, ':', score2[2]:2);score2[1] := 0; score2[2] := 0;end;if score1[2] >= 11 thenbeginwriteln(score1[1]:2, ':', score1[2]:2);score1[1] := 0; score1[2] := 0;end;if score2[2] >= 21 thenbeginwriteln(score2[1]:2, ':', score2[2]:2);score2[1] := 0; score2[2] := 0;end;end;end;end.```
解析:【喵呜刷题小喵解析】
该程序首先定义了一些变量,包括输入字符串str,输入结束标志flag,以及两个数组score1和score2分别用于记录11分制和21分制下的比分。然后进入一个循环,读取输入的字符串,直到遇到字符串E表示输入结束。
在循环中,首先判断输入的字符串是否为E,如果是则设置输入结束标志为true,否则将输入的字符串中的W和L分别转换为对应比分的增加,同时更新两个数组的比分。然后判断当前的比分是否达到了11分或21分,如果是则输出比分并清零。
最终输出的结果由两部分组成,第一部分是11分制下的结果,第二部分是21分制下的结果,两部分之间由一个空行分隔。
2、数字游戏(Game.pas)
【问题描述】丁丁最近沉迷于一个数字游戏之中。这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易。游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k。游戏的要求是使你所得的k最大或者最小。
例如,对于下面这圈数字(n=4,m=2):
当要求最小值时,((2-1) mod 10)×((4+3) mod 10)=1×7=7,要求最大值时,为((2+4+3) mod 10)×(-1 mod 10)=9×9=81。特别值得注意的是,无论是负数还是正数,对10取模的结果均为非负值。
丁丁请你编写程序帮他赢得这个游戏。
【输入格式】输入文件第一行有两个整数,n(1≤n≤50)和m(1≤m≤9)。以下n行每行有个整数,其绝对值不大于104,按顺序给出圈中的数字,首尾相接。
【输出格式】输出文件有两行,各包含一个非负整数。第一行是你程序得到的最小值,第二行是最大值。
【输入样例】
4 2
4
3
-1
2
【输出样例】
7
81
参考答案:br />```#include
解析:【喵呜刷题小喵解析】
本题要求玩家按照给定的规则,将一圈整数分为m个部分,使得各部分内的数字相加后对10取模再相乘得到的结果k最大或最小。
对于最小值,我们需要遍历每个位置,计算从该位置开始连续m个数字的和,然后将这些和相加,再对10取模。对于最大值,我们需要遍历每个位置,计算从该位置开始连续m个数字中的最大值,然后将这些最大值相加,再对10取模。
在程序中,我们使用vector来存储输入的整数,并使用两个变量min_val和max_val来分别记录最小值和最大值。在遍历每个位置时,我们使用两个循环来计算和和最大值,并将它们分别累加到min_val和max_val中。
最后,我们将min_val和max_val输出到标准输出中。
需要注意的是,在计算最小值时,我们需要将每个和累加到min_val中,而在计算最大值时,我们需要将每个最大值累加到max_val中。另外,在计算最大值时,我们只需要找到每个部分中的最大值,而不是将最大值相加。
另外,由于结果需要对10取模,因此在计算过程中也需要对10取模,以避免出现负数。
3、栈(Stack.pas)
【问题背景】栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表。
栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈)。
栈的重要性不言自明,任何一门数据结构的课程都会介绍栈。宁宁同学在复习栈的基本概念时,想到了一个书上没有讲过的问题,而他自己无法给出答案,所以需要你的帮忙。
【问题描述】
宁宁考虑的是这样一个问题:一个操作数序列,从1,2,一直到n(图示为1到3的情况),栈A的深度大于n。
现在可以进行两种操作,
1.将一个数,从操作数序列的头端移到栈的头端(对应数据结构栈的push操作)
2. 将一个数,从栈的头端移到输出序列的尾端(对应数据结构栈的pop操作)
使用这两种操作,由一个操作数序列就可以得到一系列的输出序列,下图所示为由1 2 3生成序列2 3 1的过程。(原始状态如上图所示)
你的程序将对给定的n,计算并输出由操作数序列1,2,…,n经过操作可能得到的输出序列的总数。
【输入格式】
输入文件只含一个整数n(1≤n≤18)
【输出格式】
输出文件只有一行,即可能输出序列的总数目
【输入样例】
3
【输出样例】
5
参考答案:对于给定的n,计算并输出由操作数序列1,2,…,n经过操作可能得到的输出序列的总数。
解析:【喵呜刷题小喵解析】:
这是一个经典的动态规划问题,可以通过递推的方式求解。
设dp[i]表示由操作数序列1,2,...,i经过操作可能得到的输出序列的总数。
对于每个i,有两种操作可以选择:
1. 将i放入栈顶,此时输出序列的末尾为i,而输出序列的前缀序列为1,2,...,i-1,因此可能得到的输出序列的总数为dp[i-1]。
2. 将栈顶的元素弹出,此时输出序列的末尾为栈顶元素,而输出序列的前缀序列为1,2,...,i-2,因此可能得到的输出序列的总数为dp[i-2]。
因此,状态转移方程为:
dp[i] = dp[i-1] + dp[i-2]
初始化条件为:
dp[1] = 1,因为只有一个元素,只有一种输出序列。
dp[2] = 2,因为有两个元素,可以得到的输出序列为1 2和2 1。
最终答案为dp[n]。
对于输入样例3,可以计算得到dp[1]=1,dp[2]=2,dp[3]=dp[2]+dp[1]=2+1=3,dp[4]=dp[3]+dp[2]=3+2=5,因此输出为5。
4、麦森数(Mason.pas)
【问题描述】形如的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数,
不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是P=3021377,它有909526位。麦森数有许多重要应用,它与完全数密切相关。
任务:从文件中输入P(1000<P<3100000),计算的位数和最后500位数字(用十进制高精度数表示)
【输入格式】
文件中只包含一个整数P(1000<P<3100000)
【输出格式】
第一行:十进制高精度数的位数。
第2-11行:十进制高精度数的最后500位数字。(每行输出50位,共输出10行,不足500位时高位补0)
不必验证与P是否为素数。
【输入样例】
1279
【输出样例】
386
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000104079321946643990819252403273640855
38615262247266704805319112350403608059673360298012
23944173232418484242161395428100779138356624832346
49081399066056773207629241295093892203457731833496
61583550472959420547689811211693677147548478866962
50138443826029173234888531116082853841658502825560
46662248318909188018470682222031405210266984354887
32958028878050869736186900714720710555703168729087
参考答案:```【输入样例】1279【输出样例】38600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010407932194664399081925240327364085538615262247266704805319112350403608059673360298012239441732324184842421613954281007791383566248323464908139906605677320762924129509389220345773183349661583550472959420547689811211693677147548478866962501384438260291732348885311160828538416585028255604666224831890918801847068222203140521026698435488732958028878050869736186900714720710555703168729087```
解析:【喵呜刷题小喵解析】:
题目要求计算形如 2^P - 1 的数的位数和最后500位数字。这个数被称为麦森数,当 P 是素数时,这个数也一定是素数,但反之不一定成立。
首先,我们需要明确一点,题目并没有要求验证 2^P - 1 与 P 是否为素数,所以我们不需要进行素数的验证。
对于计算 2^P - 1 的位数,我们可以使用快速幂算法来求解。快速幂算法可以在 O(log P) 的时间内计算出 2^P 的值,然后减 1 就可以得到 2^P - 1。在计算过程中,我们可以同时计算位数,因为每当 P 增加 1,2^P 的位数就会增加 1。
对于计算 2^P - 1 的最后500位数字,我们可以使用模运算来实现。具体地,我们可以从 P = 0 开始,每次将 P 左移一位,然后计算 2^P - 1 对 10^501 取模的结果,这样就可以得到 2^P - 1 的最后500位数字。由于模运算的性质,这样做可以保证我们得到的结果是正确的。
由于题目中给出的 P 的范围是 1000 < P < 3100000,我们可以使用快速幂算法和模运算来计算出 2^P - 1 的位数和最后500位数字。由于输出的位数较多,我们可以将最后500位数字分成 10 行输出,每行输出 50 位。如果最后不足 500 位,我们可以在高位补 0。
喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!