求20000以内的素数和
import mathdef is_prime(number):
if number > 1:
if number == 2:
return True
if number % 2 == 0:
return False
for current in range(3, int(math.sqrt(number) + 1), 2):
if number % current == 0:
return False
return True
return False
def get_primes(number):
while True:
if is_prime(number):
yield number
number += 1
def solve():
total = 2
for next_prime in get_primes(3):
if next_prime < 2000000:
total += next_prime
else:
print(total)
return
if __name__ == '__main__':
solve()
这个代码的从头到尾都看不懂能帮忙注释一下每个语句的含义吗{:5_102:} @Twilight6 波大大12138 发表于 2020-6-29 21:50
@Twilight6
好等下就来看哈哈~ 波大大12138 发表于 2020-6-29 21:50
@Twilight6
看注释吧:
import math
def is_prime(number):# 这个函数用来计算质数
if number > 1:# 质数定义 必须大于 1 才有意义
if number == 2:# 最小的质数就是 2 了 如果是 2 直接返回
return True
if number % 2 == 0:# 如果被 2 整除了说明不是质数,这边单独列出来,防止开平方后数小导致没进入 for 循环进行判断
return False
for current in range(3, int(math.sqrt(number) + 1), 2):# 用开平方来计算质数,大大去除重复率
if number % current == 0:# 只要有一次整除 则就不为质数
return False
return True# 全部都for 还没返回 说明是该数只被 1 和 本身整除,是质数
return False# 质数必须大于 1 才有意义
def get_primes(number):# 含有 yield 的关键字函数,就算是生成器 generator
while True:
# 生成器必须有 while 循环,因为每次运行到 yield 返回后下次运行就从 yield 的下一行开始运行,所以需要 while 循环来持续”产生“yield
if is_prime(number): # 计算质数,直到为质数然后通过生成器返回
yield number
number += 1
def solve():
total = 2 # 初始化,这个是最小的质数所以下面直接从 3 开始计算
for next_prime in get_primes(3):# 循环调用生成器 生成质数
if next_prime < 2000000:# 小于两百万以下的质数条件
total += next_prime# 每次生成出的质数列加到 total 上
else:
print(total)# 直到 next_prime 质数大于两百万 然后返回
return
if __name__ == '__main__':
solve()
Twilight6 发表于 2020-6-29 23:54
看注释吧:
if __name__ == '__main__':
solve()
最后这个语句啥意思啊, 本帖最后由 Twilight6 于 2020-8-18 21:24 编辑
波大大12138 发表于 2020-6-30 09:02
if __name__ == '__main__':
solve()
当你把这个脚本当作模块导入其他脚本中,if __name__ == '__main__': 下面的方法是不被调用的
而平时你就可以当作调用主程序来用的即可
页:
[1]