Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python几十亿次迭代循环_Python_Loops_Iteration - Fatal编程技术网

Python几十亿次迭代循环

Python几十亿次迭代循环,python,loops,iteration,Python,Loops,Iteration,我是编程新手,所以请容忍我 我写这段代码是为了找到一个数的最大素数因子,但当我输入一个十亿或更大的数时,它无法求解。我尝试过xrange,但我使用的是Python 3.4。谁能给我指出正确的方向吗 done = False num = int(input("Enter a number: ")) for j in range(num,2,-1): if (num % j) != 0: continue for i in range(2

我是编程新手,所以请容忍我

我写这段代码是为了找到一个数的最大素数因子,但当我输入一个十亿或更大的数时,它无法求解。我尝试过xrange,但我使用的是Python 3.4。谁能给我指出正确的方向吗

done = False

num = int(input("Enter a number: "))

for j in range(num,2,-1):

        if (num % j) != 0:
            continue
        for i in range(2,j):     
            if (j % i) != 0:
                continue
            break


        else: break

print(j)

这是一个O(n^2)算法。它似乎没有解决,因为它只是花了很长时间。解决方案使用numpy。或者找到一个非幼稚的算法,或者自己编写一个。Eratosthenes的筛选是一个很好的起点。

由于您是编程新手,这里有一个简单的解决方案(但要知道,有更多更复杂的解决方案更有效)。首先请注意,您只需要检查num的平方根以下的除数,因为如果num=a*b,则一个小于平方根,一个大于平方根。其次,你只需要检查素数因子

您可以按如下方式生成素数列表:

import math
import itertools

def primes_generator():
    """Generator for the infinite list of primes."""
    primes = [2, 3]
    for prime in primes:
        yield prime
    for c in itertools.count(5, 2):
        bound = math.sqrt(c)
        for p in primes:
            if not (c % p):
                break
            if p > bound:
                primes.append(c)
                yield c
                break
现在要查找所有素因子:

def prime_factorization(number, primes=None):
    if not primes:
        primes = primes_generator()
    factorization = dict()
    for p in primes:
        count = 0
        while not (number % p):
            number = number / p
            count = count + 1
        if count:
            factorization[p] = count
        if number == 1:
            return factorization
最大的素因子就是字典中最大的键。对于相当大的输入,这些函数应该可以正常工作。在我的机器上,以下时间为0.06秒

 print(max(prime_factorization(1000000001).keys()))

你能解释一下吗?谢谢。从空闲状态粘贴效果不太好。为什么?因为确实如此。我误解了<代码>的含义:中断。话虽如此,我怀疑您的问题在于您的代码运行时间太长。@jdgalaway不,这是关于算法设计的。注意我下面说的关于你的循环次数的话?看看数学,试着算出一行执行了多少次
%
。将代码粘贴到这里()并用小数字运行。我不认为numpy是为分解数字而设计的?有趣。我要做些调查。非常感谢。。。到目前为止:)另外,如果你没有抓住它,查找大o符号(这就是o(n^2)的意思——你不仅循环了10亿次,而且循环了10亿次!我没有抓住,但我确实意识到嵌套循环放大了这个问题。我不认为它是
o(n^2)
。它不会对小于或等于
n
的每个数字做线性功,它只对
n
的每个因子做线性功,从算法上讲,这不是比
n
小吗?我知道,人们说,嘿,你可以在商店里买苍蝇,但你可以在商店里买鱼,埃德,你明白我的意思吗?当然,去商店。去吧在这里,向那个人描述你将在哪里钓鱼,为了什么,天气条件,太阳,没有太阳,等等,然后你最好让那个人把该死的鱼卖给你。