当前位置: 源码素材网 » Python教程 » 详情页

Python 求0—7所能组成的奇数个数,每个数只出现一次

  •   时间:2019-09-08
  • 概述:数列组合

题目没有说清楚,我觉得应该是0-7每个数字只能出现一次!

#情况(1)0-7只能且必须出现一次的情况:
#4*6*6! 最低位:4个,最高位不能取0:6个,中间6个数的全排列
print('能组成{}个奇数'.format(4*6*reduce(lambda x,y:x*y,range(2,7))))
#情况(2)0-7只能出现一次的情况,但不必全出现:
#一位数时:4
#二位数时:4*6
#三位到8位数时:4*6*6!/(6-m)! m为位数(3-8)
n=4+4*6+4*6*sum([reduce(lambda x,y:x*y, range(7-m,7)) for m in range(1,7)])
print('能组成{}个奇数'.format(n))
#这是个数学题,数学没学好真费劲
#用计算机的笨方法试一下,也好验证下上面的算法对不对
#!!!!下面的程序会运行几分钟!!!!
print('请等待...')
#情况(1)
total=0
sets=['1','2','3','4','5','6','7','0']
for i in range (10000001,77777777):
    s=str(i)
    for x in s: #如果不全是由0-7组成
        if x not in sets:
            break
    else:#这是for的else,在没有遇到break时进入
        # i%2!=0 可以简写成 i%2
        if i%2 and len(s)==len(set(s)): #如果是奇数并且没有重复数字
            total+=1
print(total)
print('请等待...')
#情况(2)
total=0
sets=['1','2','3','4','5','6','7','0']
for i in range (1,77777777):
    s=str(i)
    for x in s:
        if x not in sets:
            break
    else:
        if i%2!=0 and len(s)==len(set(s)):
            total+=1
print(total)
#总结:
#最后结果验证了数学方法的快速和可靠
#数学方法要比计算机的笨方法好的多,用时1秒对几分钟
'''
#原程序 计算的是0-7位数,0-7可以重复的情况,应该是不符合题意的
if __name__ == '__main__':
    sum = 4
    s = 4
    for j in range(2,9):
        print sum
        if j <= 2:
            s *= 7
        else:
            s *= 8
        sum += s
    print 'sum = %d' % sum
'''

 

    相关声明:

      若“Python 求0—7所能组成的奇数个数,每个数只出现一次”有损您的权益,请告之我们删除内容。
      部分文章来源于网络,版权归原作者所有。