Python练习(二) 4位数四则运算

题目:在一个数的各个数字之间插入四则运算的运算符组成算式,
然后计算算式的结果(某些数位之间可以没有运算符,但整个表达式中最少要插入 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,满足上述条件的数。(出处:程序员的算法趣题)

直接上代码:欢迎交流,本人能力有限,有更快算法请分享。

Python练习(二) 4位数四则运算
"""***********************************"""
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

结果如下:

Python练习(二) 4位数四则运算

 

上一篇:数字转中文大写金额


下一篇:Objective-C/C++ocoa试图创建一个带按钮的窗口,不工作?