似乎很难找到OJ允许提交Python,好不容易发现NEUQ的OJ可以交Python,但是只支持2.7,这……就比较尴尬了……
迫于无奈,只好上网搜题目做,然后自己测试(毕竟我还只是个Hello World水平的Python小白)
然后就看到一道小时候难住了很多人的题(当老师说这道题是用枚举法做的时候,我……(╯‵□′)╯︵┻━┻)
题面如下:
题目:有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
分析:
其实,这道题……好像只能暴力解(即使是用c++写,也会毫不犹豫的使用暴力法解)
代码如下:
for i in range(1,5):
for j in range(1,5):
for t in range(1,5):
if((i!=j)and(j!=t)and(i!=t)):
print (i,j,t)
输出:
1 2 3
1 2 4
1 3 2
1 3 4
1 4 2
1 4 3
2 1 3
2 1 4
2 3 1
2 3 4
2 4 1
2 4 3
3 1 2
3 1 4
3 2 1
3 2 4
3 4 1
3 4 2
4 1 2
4 1 3
4 2 1
4 2 3
4 3 1
4 3 2
‘’‘
如上↑是3.0版的
下面提供2.7版的↓
‘’’
for i in range(1,5):
for j in range(1,5):
for t in range(1,5):
if((i!=j)and(j!=t)and(i!=t)):
print i,j,t
(1, 2, 4)
(1, 3, 2)
(1, 3, 4)
(1, 4, 2)
(1, 4, 3)
(2, 1, 3)
(2, 1, 4)
(2, 3, 1)
(2, 3, 4)
(2, 4, 1)
(2, 4, 3)
(3, 1, 2)
(3, 1, 4)
(3, 2, 1)
(3, 2, 4)
(3, 4, 1)
(3, 4, 2)
(4, 1, 2)
(4, 1, 3)
(4, 2, 1)
(4, 2, 3)
(4, 3, 1)
(4, 3, 2)
其实,这段代码初看没觉得有什么问题,但是……由于之前用的是c++,所以特别不能理解为什么是range(1,5),还有为什么range(1,5)之后最大只到了4,如果说()这样是开区间,那又为什么取得到1?
出于好奇,我就把所有的5都改成了4,输出:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
由此可见,这个5应该是小于5的意思。
把所有的1都改为0之后输出如下:
0 1 2
0 1 3
0 1 4
0 2 1
0 2 3
0 2 4
0 3 1
0 3 2
0 3 4
0 4 1
0 4 2
0 4 3
1 0 2
1 0 3
1 0 4
1 2 0
1 2 3
1 2 4
1 3 0
1 3 2
1 3 4
1 4 0
1 4 2
1 4 3
2 0 1
2 0 3
2 0 4
2 1 0
2 1 3
2 1 4
2 3 0
2 3 1
2 3 4
2 4 0
2 4 1
2 4 3
3 0 1
3 0 2
3 0 4
3 1 0
3 1 2
3 1 4
3 2 0
3 2 1
3 2 4
3 4 0
3 4 1
3 4 2
4 0 1
4 0 2
4 0 3
4 1 0
4 1 2
4 1 3
4 2 0
4 2 1
4 2 3
4 3 0
4 3 1
4 3 2
猜测:这里的1是大于等于1的意思
(╯‵□′)╯︵┻━┻,不要告诉我这还有左闭右开区间
以下,附for循环相关基础知识:
Python for 循环语句
Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串。
语法:
for循环的语法格式如下:
for iterating_var in sequence:
statements(s)
实例:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
for letter in 'Python': # 第一个实例
print '当前字母 :', letter
fruits = ['banana', 'apple', 'mango']
for fruit in fruits: # 第二个实例
print '当前水果 :', fruit
print "Good bye!"
以上实例输出结果:
当前字母 : P
当前字母 : y
当前字母 : t
当前字母 : h
当前字母 : o
当前字母 : n
当前水果 : banana
当前水果 : apple
当前水果 : mango
Good bye!
: P
当前字母 : y
当前字母 : t
当前字母 : h
当前字母 : o
当前字母 : n
当前水果 : banana
当前水果 : apple
当前水果 : mango
Good bye!
通过序列索引迭代
另外一种执行循环的遍历方式是通过索引,如下实例:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
fruits = ['banana', 'apple', 'mango']
for index in range(len(fruits)):
print '当前水果 :', fruits[index]
print "Good bye!"
以上实例输出结果:
当前水果 : banana
当前水果 : apple
当前水果 : mango
Good bye!
: banana
当前水果 : apple
当前水果 : mango
Good bye!
以上实例我们使用了内置函数 len() 和 range(),函数 len() 返回列表的长度,即元素的个数。 range返回一个序列的数。
循环使用 else 语句
在 python 中,for … else 表示这样的意思,for 中的语句和普通的没有区别,else 中的语句会在循环正常执行完(即 for 不是通过 break 跳出而中断的)的情况下执行,while … else 也是一样。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
for num in range(10,20): # 迭代 10 到 20 之间的数字
for i in range(2,num): # 根据因子迭代
if num%i == 0: # 确定第一个因子
j=num/i # 计算第二个因子
print '%d 等于 %d * %d' % (num,i,j)
break # 跳出当前循环
else: # 循环的 else 部分
print num, '是一个质数'
以上实例输出结果:
10 等于 2 * 5
11 是一个质数
12 等于 2 * 6
13 是一个质数
14 等于 2 * 7
15 等于 3 * 5
16 等于 2 * 8
17 是一个质数
18 等于 2 * 9
19 是一个质数
等于 2 * 5
11 是一个质数
12 等于 2 * 6
13 是一个质数
14 等于 2 * 7
15 等于 3 * 5
16 等于 2 * 8
17 是一个质数
18 等于 2 * 9
19 是一个质数