- 一道有关for循环的课本上的练习题:
输出所有由1、2、3、4这四个数字组成的素数,并且在每个素数中每个数字只使用一次。- 说明:此题并不难,仅仅是for循环的使用,没有涉及到算法之类的问题,之所以写在这里,是想告诉自己:再分析这种问题时,记得进行优化啊,有些步骤是可以省略的,因为可以直接走到后面的步骤;for循环减少时间复杂度的方式是,提前进行一些判断,从而使循环次数减少一些。
- 我的思路:列出所有组合,如[1, 2, 3, 4]组成的数字,然后将这个列表放到大列表中;然后将这个大列表中的所有小列表都转换为一个int型整数,如[1, 2, 3, 4] -------> 1234;然后对所有转换好的int型整数进行判断,看其是否为素数。程序实现如下:
nums = [1,2,3,4]
temp = []
result = []
for num1 in nums:
temp.append(num1)
for num2 in nums:
if num2 not in temp:
temp.append(num2)
for num3 in nums:
if num3 not in temp:
temp.append(num3)
for num4 in nums:
if num4 not in temp:
temp.append(num4)
#print(temp)
#result.append(temp)
#注意:不能直接用temp,否则后面改变temp的话,
#result中的内容也都会改变,这是因为python中的变量都是指针。。。
#最终result中的数据就都为空了!
t = []
for i in temp:
t.append(i)
result.append(t)
temp.pop()
temp.pop()
temp.pop()
temp.pop()
#print(result)
# 转换成24个整数存放在nums列表中
nums = []
for num in result:
nums.append(num[0] * 1000 + num[1] * 100 + num[2] * 10 + num[3])
print(nums)
# 从nums中找出素数存放在sushu列表中
sushu = []
import math
for num in nums:
for i in range(2, int(math.sqrt(num))+2):
if num % i == 0:
break
elif i == int(math.sqrt(num))+1 and num % i != 0:
sushu.append(num)
print(sushu)
然而,容易看出,时间复杂度太高了!空间复杂度也挺高!
- 提示:省略将大列表中的小列表转换为整数这一步骤,而是利用for循环直接得到组合出来的整数!
nums = [1,2,3,4]
result = []
for num1 in nums:
for num2 in nums:
for num3 in nums:
for num4 in nums:
if num1!=num2 and num1!=num3 and num1!=num4 and num2!=num3 and num2!=num4 and num3!=num4:
result.append(num1*1000 + num2*100 + num3*10 + num4)
print(result)
但其实时间复杂度几乎没变。
- 提示:一些判断完全可以在外层循环来做,从而使后面的循环次数减少一些,达到提高效率的效果。
nums = [1,2,3,4]
result = []
for num1 in nums:
for num2 in nums:
if num2 != num1:
for num3 in nums:
if num3 != num1 and num3 != num2:
for num4 in nums:
if num1!=num4 and num2!=num4 and num3!=num4:
result.append(num1*1000 + num2*100 + num3*10 + num4)
print(result)