我正在研究Python 3中的项目euler问题,作为一种学习语言的有趣方式,我觉得我对第三个问题的解决方案有点时髦。问题是找到最大的素数因子600851475143,我以一种非常庞大的方式解决了它,如下所示:
#!/usr/local/bin/python3
# encoding: utf-8
# what is the largest prime factor of whatever the user types
def main():
original = int(input("Input a number: "))
if original == isPrime(original):
print(original, "is prime")
else:
print(factor(original), "is the largest prime factor of", original)
def factor(number):
nummy=2
for num in range(nummy, number):
if (number%num==0 and isPrime(num)==num):
biggest=int(num)
number=int(number/biggest)
nummy = int(biggest+2)
print("so far,",biggest, "is the biggest prime factor...")
if number < biggest:
break
return biggest
def isPrime(value):
for num in range(2, int(value**0.5)+1):
if value%num==0:
return int(value/num)
return value
if __name__ == "__main__": main()
正如你所看到的,在我的“factor”函数中,我试图在for循环中更新范围的上限,但它并没有像我期望的那样真正起作用所以我不得不添加if数字&lt ;最大的障碍是让整个事情在合理的时间内运行。
有没有办法从循环内部更新for循环的参数?
我很欣赏这方面的任何见解。
答案 0 :(得分:1)
range(nummy, number)
循环之前评估 for
,因此在您的情况下是不可能的。
一般情况下,它可能在python中(尽管并非总是如此),但这是一个坏主意。最好检查变化的条件并像你一样突破循环。
答案 1 :(得分:1)
我认为这不会在合理的时间内运行。
我会指出一些事情,而不是给出解决方案:
你不需要尝试将X除以X之前的每个数字,以便知道它是素数。如果它不能被2整除,它也不能被4整除;如果不是3,那么减去9。你也可以早于(X-1)停止 - 毕竟,X不会被大于...的素数整除?
好吧,我还有3件物品,但他们都是从上面得到的。希望它能帮到你!
答案 2 :(得分:1)
正如S. Lott所说,你会想要使用while循环,但是你想要将范围的上限分配给变量,因为你希望它是可变的。
另外,我不确定你为什么这样做:
biggest=int(num)
number=int(number/biggest)
nummy = int(biggest+2)
num已经是一个int(否则,你将无法在该点之前进行数学运算)。整数除法也可以完成:
number = number // biggest