理解这个素数生成器输出的逻辑

Understanding the logic of this prime number generator output

此代码用于输出给定范围内的质数:

def sqrt(n):
    return n**0.5

# find primes
def primes(minNum, maxNum):
    primes_sum = 0
    for i in range(minNum, maxNum):
        current_max = int(sqrt(i))
        for n in range(2, current_max + 1):
            if(i%n == 0):
                break
            else:
                primes_sum += i
                print(i)
                break
            
    print('\nSum of all primes: ', primes_sum)
        
primes(10, 20)

但是,我的输出不正确:

11, 13, 15, 17, 19

有人知道 15 是怎么出现的吗?我将 print 语句放在第一个 if 语句块中,以验证 if(i%n == 0) 条件是否检测到 15,确实如此,但不知何故它仍然出现在我的最终输出中,我无法弄清楚为什么。

这个逻辑:

        for n in range(2, current_max + 1):
            if(i%n == 0):
                break
            else:
                primes_sum += i
                print(i)
                break

无法检测素数,因为如果您测试的 n 的第一个值(将为 2)不是一个因数,您将立即将其视为素数并中断循环。在确定一个数字是质数之前,您需要完成对整个范围的迭代:

        for n in range(2, current_max + 1):
            if i % n == 0:
                break
        else:
            primes_sum += i
            print(i)

请注意,elsefor 的一部分,而不是 if 的一部分——它仅在 for 循环耗尽而没有遇到 break(即如果它没有找到作为 i 因数的任何 n 值)。

我修改了你的代码。试试这样:

def sqrt(n):
    return n**0.5

# find primes
def primes(minNum, maxNum):
    primes_sum = 0
    for i in range(minNum, maxNum):
        current_max = int(sqrt(i))
        #print(current_max)
        flag = True
        for n in range(2, current_max + 1):
            #print(i,n)
            if(i%n == 0):
                flag = False
        if flag:
            print(i)
            primes_sum += i

            
    print('\nSum of all primes: ', primes_sum)
        
primes(10, 200)

在您的代码中,您没有检查所有数字是否可以被所有数字整除。对于所有奇数非素数,它将失败,因为它将检查它是否可以被 2 整除,如果不是,它就是一个素数

@SAI SANTOSH CHIRAG 完美解释了原因。我不会复制那个。我不确定你为什么使用数字的 sqrt。你可以在没有 sqrt 的情况下做这些事情。如果你使用 sqrt,你会得到错误的输出。在您的情况下,如果我们检查 18 的 sqrt,那么它的 int 将为 4,并且检查可整除性从 2 到 4,而 18 也可以被 6 整除。我正在设计一个没有 sqrt 的新代码并对其进行解释。

我的逻辑:定义一个以上限和下限为参数的函数。取一个从下限到上限的for循环。现在每个值将是范围之间的数字。我们必须检查这个数字是否是质数。使用范围从 2 到数字的循环并检查它是否可整除。如果是,则它不是质数。如果不是,则将其添加到总和中。您的代码:

def primes(low,upp):
    su=[]
    for i in range(low,upp+1):
        f=True
        for j in range(2,i):
            if i%j==0:
                f=False
        if f:
            su.append(i)
    return su,sum(su)
print(primes(10,20))