【每周一坑】罗马数字转换
罗马数字是欧洲在阿拉伯数字传入之前使用的一种数码,现在的使用已经非常少了,大概偶尔会在钟表、文章中的标号等地方还能见到。
罗马数字采用七个罗马字母作数字、即 I(1)、X(10)、C(100)、M(1000)、V(5)、L(50)、D(500)。它有一套不同于阿拉伯数字的写法规则,简单来说可以总结为:
相同的数字连写,所表示的数等于这些数字相加得到的数,如 Ⅲ=3;
小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如 Ⅷ=8、Ⅻ=12;
小的数字(限于 Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数,如 Ⅳ=4、Ⅸ=9;
在一个数的上面画一条横线,表示这个数增值 1,000 倍。
那么今天,我们就来尝试写个罗马数字和阿拉伯数字的转换器吧:
给定一个小于 3999 的罗马数,将其转换为整数,例如:Ⅲ=3、Ⅳ=4、Ⅵ=6、XIX=19、XX=20、XLV=45、MCMLXXX=1980。
附加题:
给定一个小于 3999 整数,将其转换为罗马数。
示例:
defromanToInt(s):# your code herereturni
assertromanToInt( 'III') == 3
assertromanToInt( 'IV') == 4
assertromanToInt( 'VI') == 6
assertromanToInt( 'XIX') == 19
assertromanToInt( 'XLV') == 45
assertromanToInt( 'MCMLXXX') == 1980
assertromanToInt( 'CMXCIX') == 999
期待各位同学提交解答。
提交代码可以使用 paste.ubuntu.com 或 codeshare.io 等代码分享网站,只需将代码复制上去保存,即可获得一个分享地址,非常方便。
往期问题可通过公众号菜单栏“课外辅导”栏目中进入查看。
【解答】螺旋矩阵
解题思路:
由图可知,螺旋数组中的数字运动方向依次 右 -> 下 -> 左 -> 上 -> 右 这样的循环,在合适的条件下变换累加方向即可。
变换方向的条件有两个,一是遇到数组边界,二是下一位置被其他数占据。
可用一个二维列表存储数据,按照规则将列表中填上数字,最后再输出。
示例代码:
classSpiral:def__init__(self, N):# 构造一个二维数组self.matrix = [[ Nonefori inrange(N)] forj inrange(N)]
# 起始行列数self.row = 0self.col = 0# 数组的边界值self.max_row = N
# 更换方向的标记self.mark = 0# 按需取出数组运动方向defderection(self, mark):around = [ [self.row, self.col+ 1], # 向右[self.row+ 1, self.col], # 向下[self.row, self.col- 1], # 向左[self.row- 1, self.col] # 向上]
returnaround[mark% 4]
# 针对目前位置,获取下一位置的行列数# 下一位置为边界则更换方向# 下一位置已经有元素则更换方向defnext(self):# 下一位置i = self.derection(mark=self.mark)
# 判断是否更换方向,不更换则更新 self.row / self.colif- 1notini andself.max_row notini:
ifself.matrix[i[ 0]][i[ 1]] isNone: self.row,self.col = i
returnNone# 更换方向self.mark += 1returnself.next()
defsolution(self):# 逐一取出 1 到 n^2 值fori inrange( 1,self.max_row** 2+ 1):
# 按行列赋值self.matrix[self.row][self.col] = i
# 退出条件ifi == self.max_row** 2:
break# 更新行列值self.next()
# 打印结果forr inself.matrix:
forc inr: print( '{0:^{1}}'.format(c,self.max_row), end= ' ') print( 'n')
if__name__ == '__main__': n = int(input( '>>>')) s = Spiral(n) s.solution()
@wuxiaojiao 同学的代提交答案中最简洁的
http://paste.ubuntu.com/24955910/
@徐大龙 同学的代码使用了 numpy 库
https://github.com/PeytonXu/learn-python/blob/master/cases/helix_matrix/helix_matrix.py
『码上行动』在线学习班正在开放中,详情请回复 码上行动 查看
欢迎加入
Crossin的编程教室
crossincode.com
读者交流QQ群:149164011
微信请加 crossin11 留言入群(新手/进阶)
请把我们分享给身边爱学习的小伙伴 :) 返回搜狐,查看更多
责任编辑: