【问题标题】:Finding the logical error in my code to get first 50 primes在我的代码中找到逻辑错误以获得前 50 个素数
【发布时间】:2018-11-26 14:31:18
【问题描述】:

我正在尝试编写自己的公式来查找素数,但它并不完全有效,而且我找不到我的逻辑中的缺陷。请记住,我环顾四周,但找不到与我相似的算法。

我的代码:

#Challenge 7

prime = []

num = 0

found = False

while found == False:


    if num == 0 or num == 1:
        num+=1

    else:

        for value in range(2, num+1):

            if len(prime) == 50:
                print('Found all')
                found = True
                break

            if num % value == 0:
                num+=1

            else:
                if num not in prime:
                    prime.append(num)
                else:
                    pass


print(prime)

此代码适用于前几个素数(3、5、7...) 但它也给出了不正确的值,比如 10,我不明白为什么。如果有人可以向我解释一下,以便我理解逻辑错误在哪里,我将不胜感激。

【问题讨论】:

    标签: python-3.x primes


    【解决方案1】:

    错误来自这部分

    if num % value == 0:
        num+=1
    
    else:
        if num not in prime:
            prime.append(num)
        else:
            pass
    

    一旦我们找到第一次出现的非除数,您就假设整数是素数。但是素数的定义是区间 [2..prime] 中的 每个 整数都是非除数。我们如何检查任何数字是否没有任何除数?

    def isPrime(x):
        for v in range(2, x):
            if (x % v == 0):
                return False;
    
        return True;
    

    这样的东西可以用来检查任何给定的数字是否是素数。由于我们现在已经将isPrime 部分从主循环中取出,因此我们不再需要在while 中使用for 循环。这样的事情会做

    def isPrime(x):
        for v in range(2, x):
            if (x % v == 0):
                return False;
    
        return True;
    
    prime = [}
    num = 2 
    found = False
    
    while found == False:
    
        if len(prime) == 50:
            print("found all")
            found = True
            break
    
        if(isPrime(num)):
            print(num)
            prime.append(num)
            num+=1
    
        else:
            num+=1
    

    【讨论】:

    • 您好,非常感谢您的解释。我很欣赏你的代码结构与我的相似。只有一个问题:不幸的是,我仍然不完全理解为什么我使用的逻辑不起作用 - 你能改写为什么它有缺陷吗?问题是,我看到的唯一区别是您决定将 for 循环与 while 循环分开并将其放入一个函数中,这样您就可以在 while 中调用该函数。为什么像我所做的那样在 while 中使用 for 循环是个坏主意?
    • 你说if x % y == 0 then num+=1 else prime.append(x)。但是素数的定义是x % y == 0 表示 2..x 之间的每个 y。 (而且不止一次,这里就是这种情况)。您在第一次出现非除数时将该数字添加到素数列表中,但这不足以说一个数字是素数。请注意,在我的isPrime 中,我只在循环之后返回True,而不是在循环内部。
    【解决方案2】:

    如果你为num == 10 设置断点,你会清楚地看到问题。

    当您开始在for value in range(2, num + 1): 中进行除法检查时,第二个数字是 3,因此 num (10) 模值 (3) 是 1,这是您确定素数的测试。您的测试应该是它不能被小于它的任何数整除(实际上不到一半就足够了,因为无论如何你都要检查 2)。

    因此,请考虑:

        else:
            is_indivisible = True
            # loop through all numbers less than it not including itself
            # (because x % x == 0)
            for value in range(2, num - 1):
                # it is only indivisible if it was previously indivisible
                # And the check is same as before, modulo != 0
                is_indivisible = is_indivisible and (num % value != 0)
                if not is_indivisible:
                    break
    
            # if it is indivisible and it doesn't exist in prime list yet
            if is_indivisible and num not in prime:
                prime.append(num)
    
            # move on to the next number
            num += 1
    

    【讨论】:

      猜你喜欢
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-17
      • 2015-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多