理解这个素数生成器输出的逻辑
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)
请注意,else
是 for
的一部分,而不是 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))
此代码用于输出给定范围内的质数:
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)
请注意,else
是 for
的一部分,而不是 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))