【算法趣题】Q02 数列的四则运算
作者:简单的happy 天善智能社区专栏作者
博客地址:https://www.hellobi.com/u/jasmine3happy/articles
前文传送门:【算法趣题】Q01 回文十进制数
定义
组合的方法是在各个数字之间插入四则运算的运算符组成算式,然后计算算式的结果(某些数位之间可以没有运算符,但至少要插入1个运算符)
例) 1234 → 1+2×3-4=3
假设这里的条件是,组合算式的计算结果为“将原数字各个数位上的数逆序排序得到的数”,并且算式的运算按照四则运算的顺序进行(先乘除,后加减),那么位于100~999,符合条件的有以下几种情况。
351 → 3×51 = 153
621 → 6×21 = 126
886 → 8×86 = 688
问题
求位于1000~9999,满足上述条件的数。
思考
根据组合方法的提示,各个数字之间的操作符可以有“”(无运算符),“+”(加法),“-”(减法),“*”(乘法),“/”(除法),即
operator = ['','+','-','*','/']
对于上例中的351,将351拆分为各个数的序列,有
a= 351
strList = list(str(a))
strList
['3', '5', '1']
将序列组合成3*51的算式
formulaStr = strList[0]+'*'+strList[1]+''+strList[2]
formulaStr
'3*51'
计算算式的结果
eval(formulaStr)
153
再深入思考
位于1000~9999的数是个四位数,“将原数字各个数位上的数逆序排列得到的数”也应该是四位数,即末尾不等于“0”,否则倒序后的数不足4位。
如果用了“+”,最大的值只有999+9=1008,逆序排列如要得到原始值,原始最后位只能为1,而999+1=1000,也逆序排列后也得不到原始值,当然,“-”和“/”都不可能使结果达到4位。
如果用了“*”,其后面的数字肯定不能为“0”,否则计算结果肯定不足4位。
代码及结果
现在可以写代码了。附上python代码,及结果。
operator = ['','*']
for i in range(1000,10000):
# 末尾数字不为0
if(i % 10 == 0): continue
# 将四位数转为各个数字的序列
numList = list(str(i))
for l in range(len(operator)):
for m in range(len(operator)):
for r in range(len(operator)):
# 如果操作符不为'',其后的数字不为'0'
if(operator[l]!='' and numList[1]=='0') or\
(operator[m]!='' and numList[2]=='0'):
continue
# 组合算式
formulaStr = numList[0]+operator[l]+numList[1]+operator[m]\
+numList[2]+operator[r]+numList[3]
if(len(formulaStr)>4):# 一定要插入1个运算符
# 如果算式结果等于逆序排列后的数,输出结果
if(eval(formulaStr)==int(str(i)[::-1])):
print(str(i)+" ---> "+formulaStr+"="+str(i)[::-1])
结果为:
5931 ---> 5*9*31=1395
Python爱好者社区历史文章大合集:
Python爱好者社区历史文章列表(每周append更新一次)
关注后在公众号内回复“课程”即可获取:
小编的Python入门视频课程!!!
崔老师爬虫实战案例免费学习视频。
丘老师数据科学入门指导免费学习视频。
陈老师数据分析报告制作免费学习视频。
玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。
丘老师Python网络爬虫实战免费学习视频。