一、实操题
1、 Cantor表
现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:
我们以Z字形给上表的每一项编号。第一项是1/1,然后是1/2,2/1,3/1,2/2,…
输入:整数N(1≤N≤10000000) 输出:表中的第N项
样例: INPUT OUTPUT
N=7 1/4
参考答案:对于输入的整数N,我们需要找到表中的第N项。首先,我们需要确定第N项位于表中的哪一行。由于表中的项是按照Z字形排列的,因此我们可以使用以下公式来确定第N项所在的行数:行数 = floor(sqrt(2N) + 0.5)然后,我们需要确定第N项在该行中的位置。由于每一行的项是按照递增的顺序排列的,因此我们可以使用以下公式来确定第N项在该行中的位置:位置 = 2*(行数-1)*行数 + (N - (行数-1)*行数)最后,我们需要确定第N项的具体值。由于表中的项是按照分数形式表示的,因此我们可以使用以下公式来确定第N项的具体值:分子 = 位置分母 = 行数
解析:【喵呜刷题小喵解析】:
对于输入的整数N,我们需要找到表中的第N项。由于表中的项是按照Z字形排列的,因此我们需要先确定第N项所在的行数,然后再确定第N项在该行中的位置,最后确定第N项的具体值。
首先,我们可以使用公式“行数 = floor(sqrt(2N) + 0.5)”来确定第N项所在的行数。这个公式是根据Z字形的排列规律推导出来的,它可以帮助我们快速确定第N项所在的行数。
然后,我们可以使用公式“位置 = 2*(行数-1)*行数 + (N - (行数-1)*行数)”来确定第N项在该行中的位置。这个公式是根据每一行的项是按照递增的顺序排列的规律推导出来的,它可以帮助我们快速确定第N项在该行中的位置。
最后,我们可以使用公式“分子 = 位置”和“分母 = 行数”来确定第N项的具体值。由于表中的项是按照分数形式表示的,因此我们可以直接根据第N项在该行中的位置和行数来确定第N项的具体值。
需要注意的是,由于表中的项是按照Z字形排列的,因此我们需要使用“行数 = floor(sqrt(2N) + 0.5)”这个公式来确定第N项所在的行数,而不是直接使用“行数 = N”这个公式。这是因为直接使用“行数 = N”这个公式可能会导致计算出错,因为Z字形的排列规律并不是简单的递增规律。
2、回文数
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个10进制数56,将56加56(即把56从右向左读),得到121是一个回文数。
又如:对于10进制数87:
STEP1:87+78 = 165 STEP2:165+561 = 726
STEP3:726+627 = 1353 STEP4:1353+3531 = 4884
在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。
写一个程序,给定一个N(2<=N<=10,N=16)进制数M,求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”
样例: INPUT OUTPUT
N = 9 M= 87 STEP=6
参考答案:对于给定的N进制数M,我们可以按照以下步骤来求解最少经过几步可以得到回文数:1. 将M从N进制转换为10进制。2. 从M的10进制表示开始,不断将其与它的逆序数相加,直到得到回文数或者步数超过30步。3. 如果在30步以内得到了回文数,则返回步数;否则输出“Impossible!”。
解析:【喵呜刷题小喵解析】:
对于这个问题,最直接的方法是尝试从给定的N进制数M开始,不断将其与它的逆序数相加,直到得到回文数或者步数超过30步。但是这种方法的时间复杂度较高,因为每次相加都需要将两个数从N进制转换为10进制,然后再进行加法运算,最后再将结果从10进制转换回N进制。
为了优化算法,我们可以考虑将M从N进制转换为10进制后,直接进行加法运算,而不需要每次都进行进制转换。具体来说,我们可以将M的每一位数字提取出来,然后将其与它的逆序位数字相加,得到一个新的数。这样,我们只需要在每一步中进行一次进制转换,而不是每次相加都进行进制转换。
另外,我们还需要注意一些特殊情况。例如,当M的某一位数字为0时,它的逆序位数字也为0,因此相加的结果不会改变。在这种情况下,我们可以直接跳过这一位数字,不进行相加运算。
最后,我们需要在每一步中检查是否得到了回文数。如果得到了回文数,则返回步数;否则,如果步数超过30步,则输出“Impossible!”。
需要注意的是,由于题目中给定的N进制数的范围较大(2<=N<=10,N=16),因此我们需要根据N的不同取值来编写不同的代码。同时,由于题目中没有给出具体的输入格式和输出格式,因此我们需要在实现算法时自行设计输入和输出的格式。
3、旅行家的预算
一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1、汽车油箱的容量C(以升为单位)、每升汽油能行驶的距离D2、出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di、每升汽油价格Pi(i=1,2,…,N)。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。样例: INPUT
D1=275.6 C=11.9 D2=27.4 P=2.8 N=2
OUTPUT 26.95(该数据表示最小费用)
参考答案:旅行家需要计算从出发地到目的地的最小费用。根据题目,我们需要考虑汽车油箱的容量、每升汽油能行驶的距离、出发点每升汽油价格以及沿途油站数。首先,我们需要判断旅行家是否能够到达目的地。如果沿途油站数N为0,且出发地到目的地的距离D1大于汽车油箱的容量C乘以每升汽油能行驶的距离D2,那么旅行家无法到达目的地,输出“No Solution”。否则,我们需要计算旅行家在每个油站加油的费用,并找到最小的费用。具体步骤如下:1. 如果N=0且D1>C*D2,输出“No Solution”,结束。2. 初始化费用min_cost为无穷大。3. 遍历每个油站i,从出发地到油站i的距离为Di,每升汽油的价格为Pi。* 计算从出发地到油站i所需的油量total_fuel = (Di+D1)/D2。* 如果total_fuel大于油箱容量C,跳过该油站。* 否则,计算在该油站加油的费用cost = ceil(total_fuel)*Pi。* 如果cost小于min_cost,更新min_cost为cost。4. 输出min_cost,结束。
解析:【喵呜刷题小喵解析】:
本题考查的是旅行家驾驶汽车以最少的费用从一个城市到另一个城市的问题。我们需要根据题目给出的数据,计算出旅行家驾驶汽车从出发地到目的地的最小费用。
首先,我们需要判断旅行家是否能够到达目的地。如果沿途油站数N为0,且出发地到目的地的距离D1大于汽车油箱的容量C乘以每升汽油能行驶的距离D2,那么旅行家无法到达目的地,输出“No Solution”。
否则,我们需要计算旅行家在每个油站加油的费用,并找到最小的费用。具体步骤如下:
1. 遍历每个油站i,从出发地到油站i的距离为Di,每升汽油的价格为Pi。
2. 计算从出发地到油站i所需的油量total_fuel = (Di+D1)/D2。
3. 如果total_fuel大于油箱容量C,说明在该油站无法加油,跳过该油站。
4. 否则,计算在该油站加油的费用cost = ceil(total_fuel)*Pi。
5. 如果cost小于当前最小费用min_cost,更新min_cost为cost。
6. 遍历完所有油站后,输出min_cost作为最小费用。
需要注意的是,在计算加油费用时,我们需要对油量进行向上取整,因为不能加半升油。另外,如果沿途没有油站,且旅行家的汽车无法到达目的地,我们需要输出“No Solution”。
喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!