程序题目:0~9这10个数字可以组成多少不重复的3位数?


我的思路:使用三个for循环将所有的可能组成的数全部列出,然后去掉小于100的,去掉三位数中有重复数字的,最后输出不重复的三位数的个数和全部的数;


我的程序:

inter=[]
for i in range(10):
    for j in range(10):
        for k in range(10):
            num=100*i+10*j+k
            if i!=j and j!=k and i!=k and num >=100:
                inter.append(num)
print "there are %d non-repeat number" % len(inter)
print "no repeat numbers are: ",inter


官方源码:

# a:1-9, b:0-9, c:0-9
l = range(10)
count = 0
for a in l[1:]:
    for b in l:
        if a == b: continue #过滤a == b
        for c in l:
            if c != a and c != b: #过滤a == c, b == c
                print a, b, c
                count += 1
print 'count:', count


源码分析:

根据提供的示例可以看出,它是直接定义一个包含0~9的列表,第一次循环时a的取值为1~9,直接就过滤了两位数,这个比较好,值得借鉴,不像我的代码那样每次都要判断是否大于100了,第二次循环时b的取值再是0~9,然后通过一个判断语句来过滤a=b的数,其实就是过滤如11X  22X...这样的数,如果满足第二次循环就再进行第三次循环,第三次循环是判断c不等于a和b的,如果满足这些要求就是不重复的三位数了;


总结:

  1. 判断列表中元素的元素可以使用len()函数;

  2. 关于continue和break

    Python中的break语句可以结束当前循环然后跳转到下个语句,常用在当某个外部条件被触发(一般通过if语句检查)需要立即从循环中退出时,break语句可以用在while和for循环中;




    当遇到continue语句时,程序会终止当前循环,并忽略剩余的语句,然后回到循环的顶端。在开始下一次迭代前,如果是条件循环,我们将验证条件表达式;如果是迭代循环,我们将验证是否还有元素可以迭代,只有在验证成功的情况下,才开始进行下一次迭代;


题目出处:http://www.cheemoedu.com/exercise/11