zoukankan      html  css  js  c++  java
  • Project Euler:Problem 93 Arithmetic expressions

    By using each of the digits from the set, {1, 2, 3, 4}, exactly once, and making use of the four arithmetic operations (+, −, *, /) and brackets/parentheses, it is possible to form different positive integer targets.

    For example,

    8 = (4 * (1 + 3)) / 2
    14 = 4 * (3 + 1 / 2)
    19 = 4 * (2 + 3) − 1
    36 = 3 * 4 * (2 + 1)

    Note that concatenations of the digits, like 12 + 34, are not allowed.

    Using the set, {1, 2, 3, 4}, it is possible to obtain thirty-one different target numbers of which 36 is the maximum, and each of the numbers 1 to 28 can be obtained before encountering the first non-expressible number.

    Find the set of four distinct digits, a < b < c < d, for which the longest set of consecutive positive integers, 1 to n, can be obtained, giving your answer as a string: abcd.



    先求出10选4的全部组合情况,保存为list

    对于每一种组合都有24种排列情况

    每个排列情况其运算顺序都有5种

    关于四个数的运算涉及到3个操作符。并且每一个操作符理论上有四种选择:加减乘除。并将得出的整数运算结果标记出来。


    终于是要比較每一种组合的标记出来的结果,从1到n都有标记的最大的那个n


    def xcombination(seq,length):
            if not length:
                    yield []
            else:
                    for i in range(len(seq)):
                            for result in xcombination(seq[i+1:],length-1):
                                    yield [seq[i]]+result
    
    def nextPermutation(self, num):
            if len(num) < 2:
                return num
            partition = -1
            for i in range(len(num) - 2, -1, -1):
                if num[i] < num[i + 1]:
                    partition = i
                    break
            if partition == -1:
                return num[::-1]
            for i in range(len(num) - 1, partition, -1):
                if num[i] > num[partition]:
                    num[i], num[partition] = num[partition], num[i]
                    break
            num[partition + 1:] = num[partition + 1:][::-1]
            return num
    
    
    def ope(a,b,num):
        if a==None or b==None:
            return None
        if num == 1:
            return a+b
        if num == 2:
            return a-b
        if num == 3:
            return a*b
        if num == 4:
            if b == 0:
                return None
            else:
                return a/b
    
    
    comb=xcombination([i for i in range(10)],4)
    comb_list=list(comb)
    bestprem=[0 for i in range(4)]
    bestres=0
    for prem in comb_list:
        tmp=prem
        flag=1
        num_list=[0]*(9*8*7*6)
        while tmp != prem or flag==1:
            flag=0
            for i in range(1,5):
                for j in range(1,5):
                    for k in range(1,5):
                        num=ope(ope(ope(prem[0],prem[1],i),prem[2],j),prem[3],k)
                        if num!=None and num==int(num) and num > 0 and num < len(num_list):
                            num_list[int(num)]=True
    
                        num=ope(ope(prem[0],ope(prem[1],prem[2],j),i),prem[3],k)
                        if num!=None and num==int(num) and num > 0 and num < len(num_list):
                            num_list[int(num)]=True
    
                        num=ope(prem[0],ope(ope(prem[1],prem[2],j),prem[3],k),i)
                        if num!=None and num==int(num) and num > 0 and num < len(num_list):
                            num_list[int(num)]=True
    
                        num=ope(prem[0],ope(prem[1],ope(prem[2],prem[3],k),j),i)
                        if num!=None and num==int(num) and num > 0 and num < len(num_list):
                            num_list[int(num)]=True
    
                        num=ope(ope(prem[0],prem[1],i),ope(prem[2],prem[3],k),j)
                        if num!=None and num==int(num) and num > 0 and num < len(num_list):
                            num_list[int(num)]=True
            count=1
            while num_list[count]==True:
                count=count+1
    
            if count > bestres:
                bestres=count
                bestprem=prem
    
            prem=nextPermutation((),[prem[i] for i in range(4)])
            
    print(bestres,' ',bestprem)
        
            
    



  • 相关阅读:
    Smarty学习笔记(二)
    Smarty学习笔记(一)
    MVC学习笔记(一)
    2015羊年主流手机配置什么样?
    FPGA学习笔记(一)Verilog语法基础
    FPGA学习笔记(二)模块建立及变量连接
    STM32学习笔记(一)时钟和定时器
    Win8 HTML5与JS编程学习笔记(一)
    Win8 HTML5与JS编程学习笔记(二)
    LUOGU P2831 愤怒的小鸟 (NOIP 2016)
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7059184.html
Copyright © 2011-2022 走看看