题目:在一个数的各个数字之间插入四则运算的运算符组成算式,
然后计算算式的结果(某些数位之间可以没有运算符,但整个表达式中最少要插入 1 个运算符)。
例如:
1234 -> 1+2×3-4 = 3
9876 -> 9×87+6 = 789
假设这里的条件是,组合算式的计算结果为“将原数字各个数位上的数逆序排列得到的数”,
并且算式的运算按照四则运算的顺序进行(先乘除,后加减)。
那么位于 100~999,符合条件的有以下几种情况。
351 -> 3×51 = 153
621 -> 6×21 = 126
886 -> 8×86 = 688
求:位于 1000~9999,满足上述条件的数。(出处:程序员的算法趣题)
直接上代码:欢迎交流,本人能力有限,有更快算法请分享。
"""***********************************""" import numpy as np import datetime def cal_fit_num(num): numstr=str(num) numstr_len=len(numstr) if numstr_len!=4: return "None" """需要的结果,有点特别的是,运算符只能是乘法连接才有机会满足题目要求""" numinv=int(numstr[::-1]) numstr=list(str(num)) """第一种情况;插入3个运算符""" resultnum1=int(numstr[0])*int(numstr[1])*int(numstr[2])*int(numstr[3]) if(numinv==resultnum1): return num """第二种情况;插入2个运算符""" resultnum21=int(numstr[0]+numstr[1])*int(numstr[2])*int(numstr[3]) if(numinv==resultnum21): return num resultnum22=int(numstr[0])*int(numstr[1]+numstr[2])*int(numstr[3]) if(numinv==resultnum22): return num resultnum23=int(numstr[0])*int(numstr[1])*int(numstr[2]+numstr[3]) if(numinv==resultnum23): return num """第三种情况;插入1个运算符""" resultnum31=int(numstr[0]+numstr[1]+numstr[2])*int(numstr[3]) if(numinv==resultnum31): return num resultnum32=int(numstr[3])*int((numstr[1]+numstr[2]+numstr[3])) if(numinv==resultnum32): return num return "None" print("******************************************") start = datetime.datetime.now() num=1000 allnum=[] while(num!=10000): rvalue= cal_fit_num(num) if(rvalue!="None"): allnum.append(rvalue) num=num+1 end=datetime.datetime.now() spendtime=end-start print("find allnum is:") print(allnum) print("find allnum in [1000,9999] Spend time:{}".format(spendtime))View Code
结果如下: