file = open('funny_file.txt', 'r')
list = []
for i in file:
list.append(int(i[:-1]))
print(len([num for num in list for i in range(100) if num == 3**i]))
结果很好,但我能用其他更简单的方法吗?
假设最大指数是100
(来自range(100)
(。您可以进行相当O(1(的计算。首先可以计算3^100
=515377520732011331036461129765621272702107522001
。现在,这个数字除以3的任意幂(小于这个数字(会提醒我们0。所以你可以写:
def check_power_of_three(n):
return 515377520732011331036461129765621272702107522001 % n == 0
现在,关于您的代码。我不明白你为什么要做两个循环,而你只需要一个就可以实现同样的事情。
file = open('funny_file.txt', 'r')
numList = [] # I changed the name to avoid conflicts with `list` type
powerOfThree = []
for i in file:
n = int(i[:-1])
numList.append(n)
if check_power_of_three(n):
powerOfThree.append(n)
print(len(powerOfThree))
# Also remember to close() the file
file.close()
输出:
1
^哪个是27
我假设"3的平方"是指3的幂。
你的印刷声明中有一些内容,我建议你修改一下。通常,当您对实现特定结果感兴趣时,为其创建一个单独的函数来封装该功能是有意义的。在这种情况下,它可能是一个函数,告诉我们它的输入是否是三次方。使用以三为底的对数,您应该能够实现该函数。
优化代码的一种方法是跳过之前已经研究过的数字的计算,如下所示:
file = open('funny_file.txt', 'r')
list = []
for i in file:
list.append(int(i[:-1]))
powerof_3_nums = []
not_power_of_3 = []
for num in list:
if num in powerof_3_nums:
continue
if num in not_power_of_3:
continue
for i in range(100):
if num == 3**i:
powerof_3_nums.append(num)
print(len(powerof_3_nums))