赞
踩
编程实现:
给定一个正整数 M(1≤M≤5)和一个只包含数字的字符串(5<字符串长度≤20)。使用 M 个乘号插入到字符串中,且两个乘号不能相邻,插入后生成一个乘法算式。找出一种使乘法算式数值最大的插入方式,并将结果输出。(乘号不能放在字符串的首尾位置)
如 M=2,字符串为 123456,插入 2 个乘号。插入方式有:
123456=6912,123456=10488,123456=13104 , 123456=14070
123456=16416,123456=22848 ,123456=24840 ,
123456=27552,123456=33210,
123456=37020。
其中乘法算式数值最大是第十种,为37020。
输入描述:
第一行输入一个正整数 M(1≤M≤5),表示乘号个数
第二行输入一个只包含数字的字符串(5<字符串长度<20),表示要插入 M 个乘号的字符串
输出描述:
输出一个整数,表示最大乘积数值
样例输入:
2
123456
样例输出:
37020
解题思路:
1、这道题是一道排序的题目。通过插入’'在不同的字符不同的位置上,但这里要注意一下。在Python中,字符串是不可变的,字符串无法直接删除、插入字符串之间的特定字符。
2、字符串本身特性是不能直接插入,所以借助列表去解决。
3、这里现在懂得eval函数语法特性,通过语法特性将字符型’123456’转化成数字的 123456。
4、join函数应用,(“”.join©)将字符列表转化成字符串
5、根据题意分析得出母类:123456、123456=16416、123456=27552、123456=37020
6、每个母类对应产生子类,如:母类123456对应子类有:123456、123456、 12345*6。以此类推。
程序如下:
A=[] def abc(list1,left,rihgt):##判断在交换过程中是否出现'1*003*04' global A r = rihgt for i in range(rihgt - 1, left, -1):##这里一定倒数循环,正面循环会提前结束 if list1[left+1] == '0'and list1[left+2]!='*': list1.pop(left+1)##如果存在第一个 * 后面 0 话 删除的之后,left的位置是不变的,继续接着判断是否 0 r-=1 else: break for i in range(len(list1)-1,r+1,-1): if list1[r+1]=='0': list1.pop(r+1) else: break A.append("".join(list1)) n=int(input()) a=list(input()) for i in range(1,len(a)-n+1): b=a[:] c=n j = i while c != 0: b.insert(j, "*") j += 2 c -= 1 c=b[:] if c[0]=='0'and c[1]!='*':##'01*23*45'这种情况,一个剔除“0” b.remove(c[0]) j -= 1 abc(b, j - 4, j - 2)##判断是否有这个类型的母类01*0*010 else: abc(c, j - 4, j-2) for z in range(j - 2, len(b) - 2): ##这里j-2原因是:j在while循环结束时,增加2,不是第二个"*"的位置 ##以一个基础类型1*2*3456,再通过循环交换方式,得到他的子类:1*23*456,1*234*56,1*2345*6 b[z],b[z+1]=b[z+1],b[z] c=b[:]##重新将b数组数据导入到c中 abc(c,j-4,z+1) print(A) a.clear() for i in range(len(A)): a.append(eval(A[i])) print(max(a))
有关注tema蓝桥杯的朋友,点点赞呗,点点关注呗
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。