python中一种完全可能情况带入计算的处理方式

#!/usr/bin/env python
#-*-encoding:utf-8 -*-

'''

例1:
lst = [1, 34, 38, 33, 40, 10, 2, 45, 24, 29]
#找出列表中的几个元素(不定,或许是一个,或许是所有),他们的平方和为 2386
#return 倒序的元素列表  只找出一种情况即可
'''
lst = [1, 34, 38, 33, 40, 10, 2, 45, 24, 29]

def check(group):#2386
    if sum([pow(x,2) for x in group]) == 2386:
        return True
    else:
        return False

def get_result():
    for i in xrange(pow(2,len(lst))):
        group = []
        t = i
        for j in xrange(len(lst)):
            group.append(t % 2)
            t /= 2
        #print group, i
        #group = sorted([list[i] for i ,x in enumerate(group) if x==1], reverse=Ture])
        group = sorted([lst[i] for i, x in enumerate(group) if x == 1], reverse=True)
        
        #抽象所有结果,带入check判断
        if check(group) == True:
            return group
            
if __name__ == '__main__':
    print get_result()

 

例2:#coding=utf-8

'''
给一个序列,输出它的勾股组合
请细读返回值格式
'''

from time import time  

def find(sequence):
    '''
    @attention: 找出序列中的   勾股组合
    @param sequence: 传入一个序列
    @return: 列表,元素为元组,元组内部正序,,例如[(3,4,5),(5,12,13),...]
    '''
    ret = []
    tmp = []
    group=[]
    #TO-DO
    for i in xrange(pow(2,len(sequence))):
        t=i
        sum=0
        for j in xrange(len(sequence)):
            tmp.append(t%2)
            t /=2   
        for m in tmp:
            if m==1:
                sum+=1
        if sum==3:
                group=sorted([sequence[n] for n,x in enumerate(tmp) if x==1], reverse=False)
                if pow(group[0],2)+pow(group[1],2)==pow(group[2],2):
                    #print tmp,i
                    ret.append(tuple(group))
        del tmp[:]
        del group[:]
    
    return ret
if __name__=='__main__':
    t = time()
    mm=find(xrange(1,20))
    print mm
    print "total run time:"
    print time()-t

 

例3:

#-*- coding:utf-8 -*-

flag=[]
stu=['A','B','C','D','E','F','G','H','I','J']
'''
A、B、C、D、E、F、G、H、I、J 共10名学生有可能参加本次计算机竞赛,也可能不参加。因为某种原因,他们是否参赛受到下列条件的约束:
   1. 如果A参加,B也参加;
   2. 如果C不参加,D也不参加;
   3. A和C中最多只能有一个人参加;
   4. B和D中有且仅有一个人参加;
   5. D、E、F、G、H 中至少有2人参加;
   6. C和G或者都参加,或者都不参加;
   7. C、E、G、I中至多只能2人参加   
   8. 如果E参加,那么F和G也都参加。
   9. 如果F参加,G、H就不能参加
   10. 如果I、J都不参加,H必须参加
'''
def check():
    '''1. 如果A参加,B也参加;'''
    if (flag[0]) and (not flag[1]):
        return False
    '''2. 如果C不参加,D也不参加;'''
    if ((not flag[2]) and flag[3]):
        return False
    '''3. A和C中最多只能有一个人参加;'''
    if flag[0] and flag[2]:
        return False
    ''' 4. B和D中有且仅有一个人参加;'''
    if flag[1] and flag[3]:
        return False
    if (not flag[1]) and (not flag[3]):
        return False
    '''6. C和G或者都参加,或者都不参加;'''
    if (not flag[2]) and flag[6]:
        return False
    if flag[2] and (not flag[6]):
        return False
    ''' 5. D、E、F、G、H 中至少有2人参加;'''
    tmp=0
    if flag[3]:
        tmp+=1
    if flag[4]:
        tmp+=1
    if flag[5]:
        tmp+=1
    if flag[6]:
        tmp+=1
    if flag[7]:
        tmp+=1
    if tmp<2:
        return False
    '''7. C、E、G、I中至多只能2人参加   '''
    tmp=0
    if flag[2]:
        tmp+=1
    if flag[4]:
        tmp+=1
    if flag[6]:
        tmp+=1
    if flag[8]:
        tmp+=1
    if tmp>2:
        return False
    '''8. 如果E参加,那么F和G也都参加。'''
    if flag[4] and (not flag[5]) and (not flag[6]):
        return False
    if flag[4] and flag[5] and (not flag[6]):
        return False
    if flag[4] and (not flag[5]) and flag[6]:
        return False
    '''9. 如果F参加,G、H就不能参加'''
    if flag[5] and flag[6] and (not flag[7]):
        return False
    if flag[5] and (not flag[6]) and flag[7]:
        return False
    if flag[5] and flag[6] and flag[7]:
        return False
    '''   10. 如果I、J都不参加,H必须参加'''
    if ((not flag[8]) and (not flag[9])) and (not flag[7]):
        return False
    else:
        return True

'''每种情况占一行。参赛同学按字母升序排列,用空格分隔,并将结果输出到competition.out文件'''
def putin(chars):
    fp =open('competition.out','a+')
    for i in chars:
        if i==chars[-1]:
            chars=chars.replace(i,i+'\n')
        chars=chars.replace(i, i+' ')
    fp.write(chars)
    fp.close()
    
'''抽象所有结果,带入check判断'''
def result():
        global flag
        for i in range(2**10):
            t=i
            for j in range(10):
                flag.append(t%2)
                t/=2
            #print flag,i
            if(check()==True):
                #print flag,i
                m=0
                #stutmp=[]
                stutmp=''
                for i in flag:
                    if i==1:
                        stutmp+=stu[m]
                        #stutmp.append(stu[m])
                        m +=1
                    else:
                        m +=1
                print stutmp
                putin(stutmp)
                #stutmp=''
                '''
                n=len(stutmp)
                while n>0:
                    flag.pop()
                    n-=1
                '''
            n=len(flag)
            while n>0:
                flag.pop()
                n-=1
if __name__=='__main__':
    result()

posted @ 2014-08-30 08:51  情愿为你,画地为牢。  阅读(361)  评论(0编辑  收藏  举报