【每周一坑】神奇的九宫格
五一小长假大家应该玩的挺开心吧,还沉浸在假日的愉悦中么?请大家收收心,准备准备月底的端午节。
看看本周的题目吧,本周的题目由读者 @疯琴 提供,我们做了小小的改进,题目为数字填充 9 宫格。
给定一个 3 * 3 的九宫格和 1 - 9 九个数字,将 9 个数字按照一定的规则填充进九宫格内,使九宫格内横、竖、斜每条线的和都相等,输出至少一种结果。
示例:
def Jiugongge(): ''' >>>Jiugongge() 4 9 2 3 5 7 8 1 6 '''
附加题:
给定一个正整数 N(N >= 1),将 1 - N^2
填充到 N * N 的格子中,使横、竖、斜(对角线)每条线的和都相等,输出至少一种组合。
比如 N 等于 3 时就是 9 宫格, N 等于 4 时为 16 宫格。
def Jiugongge(n): ''' >>>Jiugongge(n=3) 4 9 2 3 5 7 8 1 6 >>>Jiugongge(n=4) 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 '''
【求乘积最大】解答
再来看看上周的题目:
设定一个长度为 N 的数字串,将其分为两部分,找出一个切分位置,使两部分的乘积值最大,并返回最大值。
解决问题的核心在于如何将数字串依次分为两部分,大部分同学的思路为将数字串转为字符串,然后使用切片。也有同学直接使用整数除法 // 和 求余 % 分别得到两部分,以下分别给出代码
解法一:
def product(num): # 数字转为字符串 num2str = str(num)
# 预设最大的结果 max_num = 0 len_str = len(num2str)
for i in range(1,len_str):
# 分别得到字符串两边 left = num2str[:i] right = num2str[i:] res = int(left) * int(right)
# 如果现在的乘积超过目前的乘积,则更新最大值 if res > max_num: max_num = res
return max_num print(product(123456))
使用这种方法的同学比较多,参考以下同学代码:
严迪 : https://gist.github.com/kFTY/5ac7d1c224ddb44aecec7c8a51aa2ba7
奔跑的笤帚把子:http://paste.ubuntu.com/24490799/
王任 : http://paste.ubuntu.com/24493309/
大多数同学都采用这种方法,就不一一 @ 所有了。
解法二:
def product(num): # 转为字符串并获取长度 len_str = len(str(num))
# 预设最大值 max_num = 0 for i in range(1,len_str):
# 分别得到数字两边 left = num//(10**i) right = num%(10**i) res = left * right
# 判断是否更新 if res > max_num: max_num = res
return max_num print(product(123456))
使用本方法的同学就比较少了,参考 bolin 的代码
地址:http://paste.ubuntu.com/24471760/
附加题就是在上题的基础之上,对数字进行打乱处理,代码如下:
def product_2(num): num2str = str(num) max_num = 0 for n in itertools.permutations(num2str): mixnumber = "".join(n)
# 调用之前的 product 函数 res = product(int(mixnumber))
if res > max_num: max_num = res
return max_num
最后,还可以看看 张贺 同学的答案,两行代码解决一个问题。
地址:http://paste.ubuntu.com/24472288/