给定一个M进制的数,请将其转换为N进制并输出
两行,第一行为空格分隔的两个数字,分别为10进制表示的M与N;其中M, N均满足2 ≤ M、N ≤ 36
第二行为待转换的数字,其中每位超过9的部分从10至36分别用大写字母A-Z表示;输入数据保证其中最大位数对应数字不超过M
一行字符串,表示转换后的N进制数
8 16
473
13B
def to10(numlst,M):
num_10 = int(numlst,base=M)
return num_10
def toStr(n,base):
convertString="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
if n < base:
return convertString[n]
else:
return toStr(n//base,base) + convertString[n%base]
M,N = map(int,input().split(" ")
numlst=input()
n = to10(numlst,M)
base = N
print(toStr(n,base))
如课上所说,汉诺塔问题源于印度一个古老传说。对于原始的汉诺塔游戏,可供玩家操作的空间一共只有三根柱子,导致按原传说的要求,需要超过1.8*10^19步才能解开。
透过新增柱子可以大幅度地减少需要的步数。此处要求在给出指定的盘数,柱子数量为4(即限制为4根柱子)且不改变原有传说的其他规则的限制下,找出完成迁移的最小步骤数。
一个非负整数M,M代表盘数,M<=1000。
一个非负整数,表示完成迁移的最小步骤数。
3
5
1、首先还是得从递归算法的三个基本原则出发:
1)必须有基本情况:这里就是只有一个盘子
2)必须改变其状态并向基本情况靠近:
这里去分析他的一个向基本情况变化的过程:
所以在这里是存在一个最小值的比较min(preResult,2f(i)+2**(n-i)-1,另外由于这个过程中涉及到很多重复的运算,所以需要运用一下动态规划的内容,先用循环自下而上建立查询表,同时用递归自上而下去根据查询表获得结果。所以这里的基本情况转化为了在表中查询到结果,return结果,本次递归结束,进入下一轮循环迭代(return代表结束,之前这里没有搞懂)
-----------------------------------这是理解递归过程的一个非常好的栗子----------------------------------------------
举个简单的栗子:
def Hanoi_T_4(n):
Tower_list = [0] * (n + 1) #建立查询表
def f(m):
if Tower_list[m]: # 如果在递归过程中,有存储的结果,直接返回。
return Tower_list[m] # 这里得到rerun值以后,本次递归就算结束了。而不会继续进行下面result的赋值
result = 2 ** m - 1
for x in range(1, m):
result = min(result, 2 * f(x) + 2 ** (m - x) - 1)
Tower_list[m] = result
return result
return f(n)
print(Hanoi_T_4(int(input())))
谢尔宾斯基地毯是形如上图的正方形分形图案,每个地毯可分为等大小的9份,其中中央挖空,其余均由更小的地毯组成。
现给定地毯大小(行数)与组成地毯的字符元素,请打印相应的地毯图形。
注:空腔以半角空格表示;当给定字符元素长度不为1时空格数须与字符长度对应
输入为两行,分别为地毯大小正整数N与组成元素字符串c
输入数据保证N为3的正整数幂
由N行长度为N*len©的字符串构成的谢尔宾斯基地毯
9
[]
1、看这个图该怎么输出,比较合适的是通过print函数,直接一行一行打印,那着了就可以直接用两个循环来打印。那么在这个过程中就碰到问题了,就是确定一个什么条件来空开空白的内容。
2、所以就需要给每一步加一个判断条件,每一步如果是位于空白点,则打印空白,否则打印char
通过具体的图像来分析这个过程:
这里只是得到了递归的判断条件,由于i,j 是最大阶的值,所以在递归过程中需要随着递归过程调整。
def carpet(N,char):
def checkblank(n,i,j):
if n <= 1:
return True
n2 = n/3
if n2 < i <= n2 * 2 and n2 < j <= n2 * 2:
return False
return checkblank(n2,i%n2,j%n2)
for i in range(1,N+1):
for j in range(1,N+1):
if checkblank(N,i,j):
print(char,end = "")
else:
print(" "*len(char),end = "")
print('')
n=int(input())
c=input()
carpet(n,c)
注:参考了suxiaorui的博客分享内容,记录了自己的一些理解:
参考来源地址:点击转入