MOOC数据结构与算法Python版-第五周编程作业

1 进制转换(10分)

题目内容:

给定一个M进制的数,请将其转换为N进制并输出

 

输入格式:

两行,第一行为空格分隔的两个数字,分别为10进制表示的M与N;其中M, N均满足2 ≤ M、N ≤ 36

第二行为待转换的数字,其中每位超过9的部分从10至36分别用大写字母A-Z表示;输入数据保证其中最大位数对应数字不超过M

 

输出格式:

一行字符串,表示转换后的N进制数

 

输入样例:

8 16

‭473‬

 

输出样例:

‭13B‬

时间限制:500ms内存限制:32000kb

解题思路:

这个题需要两个基本的函数,M进制的数转换成10进制的数,可以通过python自带的功能直接实现,然后10进制的数转换成N进制的数,可以通过对N依次取余数,然后将余数倒序输出,并且在倒序输出余数之前正序输出最后一次的商,这个可以通过while循环实现即可。

程序代码:

# m进制转十进制
def c_m_10(num, m):
    # 公式 num = an * m**(n-1) + an-1 * m**(n-2).....+ a0 * m**0
    # 直接利用int的自带功能
    num = int(str(num), base=m)
    return num

# 十进制转m进制
def c_10_m(num, n):
    res = ""
    while num:
        res = "0123456789ABCDEFGHIGKLMNOPQRSTUVWXYZ"[num % n] + res
        num = num // n
    return res
# m进制转n进制
def m_10_n(num, m, n):
    return c_10_m(c_m_10(num, m), n)

m, n = map(int, input().split())
num = input()
print(m_10_n(num, m, n))

补充: 

2 四柱汉诺塔(10分)

题目内容:

如课上所说,汉诺塔问题源于印度一个古老传说。对于原始的汉诺塔游戏,可供玩家操作的空间一共只有三根柱子,导致按原传说的要求,需要超过1.8*10^19步才能解开。

透过新增柱子可以大幅度地减少需要的步数。此处要求在给出指定的盘数,柱子数量为4(即限制为4根柱子)且不改变原有传说的其他规则的限制下,找出完成迁移的最小步骤数。

 

输入格式:

一个非负整数M,M代表盘数,M<=1000。

 

输出格式:

一个非负整数,表示完成迁移的最小步骤数。

 

输入样例:

3

 

输出样例:

5

时间限制:500ms内存限制:32000kb

解题思路:

首先要知道什么是汉诺塔,可以看之前写过的这篇文章——三柱汉诺塔问题

但是这次是四柱汉诺塔,就是在原来三柱汉诺塔上再加一个柱子(即现在有四根柱子a,b,c,d),计算将n个盘子从第一根柱子全部移动到最后一根柱子上所需要的最小的步数,并且大的盘子不可以放到小的盘子上面。

分析:设F[n]为所求的最小步数,显然,当n=1时,F[n]=1;当n=2时,F[n]=3;如同经典汉诺塔一样,我们将移完盘子的任务分为三步: 

  1. 将x(1<=x<=n)个盘子从a柱子上依靠b,d柱子移动到c柱子上,这个过程需要的步数为F[x]。
  2. 将a柱上剩下的n-x个盘依靠b柱移到d柱。这个过程需要的步数为2^(n-x)-1。
  3. 将c柱上的x个盘依靠a,b柱移到d柱上,这个过程需要的步数为F[x]。 

故完成任务所需要的总的步数F[n]=F[x]+2^(n-x)-1+F[x]=2*F[x]+2^(n-x)-1;但这还没有达到要求,题目中要求的是求最少的步数,易知上式,随着x的不同取值,对于同一个n,也会得出不同的F[n]。即实际该问题的答案应该min{2*F[x]+2^(n-x)-1},其中1<=x<=n,我们可以用循环的方式,遍历x的各个取值,取x的各个取值中的F[n]的最小值。

程序代码1:

temp = 999999
l = [1,3]
num = int(input())
def hanoi4():
    if num == 0:
        print(0)
    else:
        for i in range(2,num):
            l.append(temp)
            for x in range(0,i):
                if (2 * l[x] + 2 ** (i-x) - 1) < l[i]:
                    l[i] = 2 * l[x] + 2 ** (i-x) - 1
        print(l[num-1])
hanoi4()

程序代码2:

这个是用递归做的

def hanoi4(n):
    h_list = [0] * (n + 1)

    def f(m):
        if h_list[m]:
            return h_list[m]
        result = 2 ** m - 1
        for x in range(1, m):
            result = min(result, 2 * f(x) + 2 ** (m - x) - 1)
        h_list[m] = result
        return result

    return f(n)
print(hanoi4(int(input())))

3 ASCII谢尔宾斯基地毯(10分)

题目内容:

谢尔宾斯基地毯是形如上图的正方形分形图案,每个地毯可分为等大小的9份,其中中央挖空,其余均由更小的地毯组成。

现给定地毯大小(行数)与组成地毯的字符元素,请打印相应的地毯图形。

注:空腔以半角空格表示;当给定字符元素长度不为1时空格数须与字符长度对应

 

输入格式:

输入为两行,分别为地毯大小正整数N与组成元素字符串c

输入数据保证N为3的正整数幂

 

输出格式:

由N行长度为N*len(c)的字符串构成的谢尔宾斯基地毯

 

输入样例:

9

[]

 

输出样例:

 

  1. [][][][][][][][][]
  2. []  [][]  [][]  []
  3. [][][][][][][][][]
  4. [][][]      [][][]
  5. []  []      []  []
  6. [][][]      [][][]
  7. [][][][][][][][][]
  8. []  [][]  [][]  []
  9. [][][][][][][][][]

 

参考程序模板:

 

  1. def carpet(N,char):
  2.     # code here
  3.     pass
  4.  
  5. n=int(input())
  6. c=input()
  7. carpet(n,c)

时间限制:500ms内存限制:32000kb

程序代码:

def carpet(N, C):
    def check(n, x, y):
        if n <= 1:
            return True
        n2 = n // 3
        if n2 <= x < n2 * 2 and n2 <= y < n2 * 2:
            return False
        return check(n2, x%n2, y%n2)

    for y in range(N):
        for x in range(N):
            if check(N, x, y):
                print(C, end='')
            else:
                print(' ' * len(C), end='')
        print('')

N = int(input())
C = input()
carpet(N,C)

 

 

 

 

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

suxiaorui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值