在python中生成素数时出错

在python中生成素数时出错,python,primes,Python,Primes,我想打印从1到10的所有素数,但是当我运行程序时,什么都不会打印 c=0 nums = [] k=0 for a in range(1,11): for b in range(1,11): if a%b==0: c = c+1 if c==2: nums.append(a)

我想打印从1到10的所有素数,但是当我运行程序时,什么都不会打印

c=0
nums = []                   
k=0
for a in range(1,11):          
    for b in range(1,11):
        if a%b==0:          
            c = c+1        
    if c==2:                  
        nums.append(a)      
        k = k+1 
for d in nums:              
    print nums[d]            
  • 在循环(第一个循环)内,您的c不会重置为零。因此,对于范围(1,11)内的a,在第:行之后设置c=0:

  • 我不知道你的k代表什么。它有用吗

  • 打印素数不需要nums[d],打印d。你是在项目上循环,而不是在索引上循环

  • 在循环(第一个循环)内,您的c不会重置为零。因此,对于范围(1,11)内的a,在第:行之后设置c=0:

  • 我不知道你的k代表什么。它有用吗

  • 打印素数不需要nums[d],打印d。你是在项目上循环,而不是在索引上循环


  • 我不明白你为什么用k

    你的c应该在“a”循环中重置,在“b”循环中重置

    代码如下:

    nums = []
    
    for a in range(1, 11):
        c = 0
        for b in range(1, 11):
            if a % b == 0:
                c = c + 1
        if c == 2:
            nums.append(a)
    print nums
    
    nums = []                   
    k=0
    for a in range(1,11):          
        c=0
        for b in range(1,11):
            if a%b==0:
                c = c+1        
        if c == 2:                  
            nums.append(a)      
            k = k+1 
    for d in nums:              
        print d
    

    我不明白你为什么用k

    你的c应该在“a”循环中重置,在“b”循环中重置

    代码如下:

    nums = []
    
    for a in range(1, 11):
        c = 0
        for b in range(1, 11):
            if a % b == 0:
                c = c + 1
        if c == 2:
            nums.append(a)
    print nums
    
    nums = []                   
    k=0
    for a in range(1,11):          
        c=0
        for b in range(1,11):
            if a%b==0:
                c = c+1        
        if c == 2:                  
            nums.append(a)      
            k = k+1 
    for d in nums:              
        print d
    
    试试这个:

    nums = []                   
    k=0
    for a in range(2,11):          
        c=0
        for b in range(1,11):
            if a%b==0:          
                c = c+1      
        if c==2: 
            nums.append(a)      
            k = k+1
    for d in nums:              
        print d
    
    你会得到

    2
    3
    5
    7
    
    请注意,代码可能更有效。

    请尝试以下操作:

    nums = []                   
    k=0
    for a in range(2,11):          
        c=0
        for b in range(1,11):
            if a%b==0:          
                c = c+1      
        if c==2: 
            nums.append(a)      
            k = k+1
    for d in nums:              
        print d
    
    你会得到

    2
    3
    5
    7
    

    请注意,代码可能更有效。

    您的代码有多个问题-每个素数都可以被1整除,因此您的检查将失败,您正在打印
    nums[d]
    ,这是错误的,
    k
    什么也不做,变量命名法太模糊,在for循环中有不必要的运行—不需要迭代范围内的所有b值,迭代现有的素数就足够了,依此类推

    下面是我将如何写它

    primes = [2]
    upper_limit = 1000 #find all primes < 1000
    
    for candidate in range(2, upper_limit):
        can_be_prime = True
        for prime in primes:
            if candidate % prime == 0:
                can_be_prime = False
                break
        if can_be_prime:
            primes.append(candidate)
    
    print primes
    
    primes=[2]
    上限=1000#查找所有小于1000的素数
    对于范围(2,上限)内的候选人:
    能不能是素数=真
    对于素数中的素数:
    如果候选%prime==0:
    能不能是素数=假
    打破
    如果可以是素数:
    素数。追加(候选)
    打印素数
    
    您的代码有多个问题-每个素数都可以被1整除,因此您的检查将失败,您正在打印
    nums[d]
    ,这是错误的,
    k
    什么都不做,变量名称太模糊,您在for循环中有不必要的运行-您不需要对范围内的所有b值进行迭代,迭代已有的素数就足够了

    下面是我将如何写它

    primes = [2]
    upper_limit = 1000 #find all primes < 1000
    
    for candidate in range(2, upper_limit):
        can_be_prime = True
        for prime in primes:
            if candidate % prime == 0:
                can_be_prime = False
                break
        if can_be_prime:
            primes.append(candidate)
    
    print primes
    
    primes=[2]
    上限=1000#查找所有小于1000的素数
    对于范围(2,上限)内的候选人:
    能不能是素数=真
    对于素数中的素数:
    如果候选%prime==0:
    能不能是素数=假
    打破
    如果可以是素数:
    素数。追加(候选)
    打印素数
    
    我在代码中添加了两条打印语句-首先,在
    下,如果a%b==0:
    ,我添加了
    打印a,b
    ;我在循环之后打印c的最终值。我得到这个输出:

    1 1
    1
    2 1
    2 2
    3
    3 1
    3 3
    5
    4 1
    4 2
    4 4
    8
    5 1
    5 5
    10
    6 1
    6 2
    6 3
    6 6
    14
    7 1
    7 7
    16
    8 1
    8 2
    8 4
    8 8
    20
    9 1
    9 3
    9 9
    23
    10 1
    10 2
    10 5
    10 10
    27
    
    这说明了为什么没有打印任何内容:在
    a==1
    中的
    b
    循环之后,c是1;在外循环的下一次迭代中完成相同的循环之后,c现在是3。因此,当进行该测试时,
    c==2
    永远不会为真,因此
    nums
    保持为空

    这也给了你一个很大的提示,你需要做什么来修复它
    c
    不断增加,但对于外部循环的每次迭代,它应该重新开始计数-因此,将
    c=0
    移动到外部
    for
    循环中。您还需要将最终打印循环更改为
    print d
    ,而不是
    print nums[d]
    ,否则将出现另一个错误。通过这些更改,您的代码如下所示:

    nums = []
    
    for a in range(1, 11):
        c = 0
        for b in range(1, 11):
            if a % b == 0:
                c = c + 1
        if c == 2:
            nums.append(a)
    print nums
    
    nums = []                   
    k=0
    for a in range(1,11):          
        c=0
        for b in range(1,11):
            if a%b==0:
                c = c+1        
        if c == 2:                  
            nums.append(a)      
            k = k+1 
    for d in nums:              
        print d
    
    它会打印出来

    2
    3
    5
    7
    

    正如所料。

    我在代码中添加了两条打印语句-首先,在
    下,如果a%b==0:
    ,我添加了
    打印a,b
    ;我在循环之后打印c的最终值。我得到这个输出:

    1 1
    1
    2 1
    2 2
    3
    3 1
    3 3
    5
    4 1
    4 2
    4 4
    8
    5 1
    5 5
    10
    6 1
    6 2
    6 3
    6 6
    14
    7 1
    7 7
    16
    8 1
    8 2
    8 4
    8 8
    20
    9 1
    9 3
    9 9
    23
    10 1
    10 2
    10 5
    10 10
    27
    
    这说明了为什么没有打印任何内容:在
    a==1
    中的
    b
    循环之后,c是1;在外循环的下一次迭代中完成相同的循环之后,c现在是3。因此,当进行该测试时,
    c==2
    永远不会为真,因此
    nums
    保持为空

    这也给了你一个很大的提示,你需要做什么来修复它
    c
    不断增加,但对于外部循环的每次迭代,它应该重新开始计数-因此,将
    c=0
    移动到外部
    for
    循环中。您还需要将最终打印循环更改为
    print d
    ,而不是
    print nums[d]
    ,否则将出现另一个错误。通过这些更改,您的代码如下所示:

    nums = []
    
    for a in range(1, 11):
        c = 0
        for b in range(1, 11):
            if a % b == 0:
                c = c + 1
        if c == 2:
            nums.append(a)
    print nums
    
    nums = []                   
    k=0
    for a in range(1,11):          
        c=0
        for b in range(1,11):
            if a%b==0:
                c = c+1        
        if c == 2:                  
            nums.append(a)      
            k = k+1 
    for d in nums:              
        print d
    
    它会打印出来

    2
    3
    5
    7
    

    正如预期的那样。

    在每个内部循环开始之前,您应该将
    c
    重置为零:

    nums = []                   
    for a in range(1,11):
        c = 0         
        for b in range(1,11):
            if a%b==0:          
                c = c+1        
        if c==2:                  
            nums.append(a)      
    for d in nums:              
        print d
    
    此外,您应该使用
    print d
    ,因为
    for
    -循环已经给出了
    nums
    中的每个元素

    与使用
    for
    -循环相比,使用列表理解通常更快,也更值得考虑


    计算素数有许多不同的方法。这里有一些

    这是您的原始算法,有一些改进

    def prime_list(num):
        """Returns a list of all prime numbers up to and including num.
    
        :num: highest number to test
        :returns: a list of primes up to num
        """
        if num < 3:
            raise ValueError('this function only accepts arguments > 2')
        candidates = range(3, num+1, 2)
        L = [c for c in candidates if all(c % p != 0 for p in range(3, c, 2))]
        return [2] + L
    
    另一个实施:

    def prime_list3(num):
        num += 1
        candidates = range(3, num, 2)
        results = [2]
        while len(candidates):
            t = candidates[0]
            results.append(t)
            candidates = [i for i in candidates if not i in range(t, num, t)]
        return results
    
    这从包含所有奇数的候选列表开始。然后,is通过删除前一个列表的第一个数字及其所有倍数来计算新的候选列表

    让我们看看算法的速度

    对于较小的数字,原始的
    素数列表
    最快

    In [8]: %timeit prime_list(10)
    100000 loops, best of 3: 8.68 µs per loop
    
    In [9]: %timeit prime_list2(10)
    100000 loops, best of 3: 10.9 µs per loop
    
    In [10]: %timeit prime_list3(10)
    100000 loops, best of 3: 8.96 µs per loop
    
    对于较大的数字,
    prime_list2
    将获得优胜者:

    In [5]: %timeit prime_list(1000)
    100 loops, best of 3: 8.28 ms per loop
    
    In [6]: %timeit prime_list2(1000)
    100 loops, best of 3: 2.46 ms per loop
    
    In [7]: %timeit prime_list3(1000)
    10 loops, best of 3: 23.5 ms per loop
    
    In [11]: %timeit prime_list(10000)
    1 loops, best of 3: 646 ms per loop
    
    In [12]: %timeit prime_list2(10000)
    10 loops, best of 3: 25.4 ms per loop
    
    In [13]: %timeit prime_list3(10000)
    1 loops, best of 3: 2.13 s per loop
    

    在每个内部循环开始之前,应将
    c
    重置为零:

    nums = []                   
    for a in range(1,11):
        c = 0         
        for b in range(1,11):
            if a%b==0:          
                c = c+1        
        if c==2:                  
            nums.append(a)      
    for d in nums:              
        print d
    
    此外,您应该使用
    print d
    ,因为
    for
    -循环已经给出了
    nums
    中的每个元素

    与使用
    for
    -循环相比,使用列表理解通常更快,也更值得考虑


    结石有很多不同的方法