第1关:除余法素性检测
任务描述
本关任务:编写一个能判断一个数是否是素数的程序。
相关知识
为了完成本关任务,你需要掌握:1.素数的定义。2.除余法 3.算法效率
编程要求
根据提示,在右侧编辑器补充代码,计算并输出某个数是否是素数。 评测时长限制为20秒,请注意你算法的时间效率。 要求用python3.6编程实现。
测试说明
平台会对你编写的代码进行测试:
- 测试输入:
58
; 预期输出:No
- 测试输入:
13
; 预期输出:Yes
- 测试输入:
8000001239
; 预期输出:Yes
代码实现
import math
def is_prime(num):
if num > 1:
if num == 2:
return 'Yes'
if num % 2 == 0:
return 'No'
for x in range(3, int(math.sqrt(num) + 1), 2):
if num % x == 0:
return 'No'
return 'Yes'
return 'No'
if __name__ == "__main__":
number = input()
a=is_prime(int(number))
print(a)
第2关:爱拉托斯散筛法
任务描述
本关任务:编写一个能使用爱拉托斯散筛法求N以内的素数的程序。
相关知识
为了完成本关任务,你需要掌握:1.爱拉托斯散筛法的原理 爱拉托斯散筛法是典型的以空间换取时间的算法。 算法过程:例如要计算100以内的素数 (1)找出sqrt(100)内是素数[2,3,5,7] (2)去掉2的倍数值 (3)去掉3的倍数值 (4)去掉5的倍数值 (5)去掉7的倍数值 (6)删除1
编程要求
根据提示,在右侧编辑器补充代码,输入数N,输出N以内的素数的列表。 要求采用python3.6编程实现
测试说明
平台会对你编写的代码进行测试:
-
测试输入:
120
; 预期输出:[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113]
-
测试输入:
512
; 预期输出:[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509]
代码实现
import math
def is_prime(num):
if num > 1:
if num == 2:
return 'Yes'
if num % 2 == 0:
return 'No'
for x in range(3, int(math.sqrt(num) + 1), 2):
if num % x == 0:
return 'No'
return 'Yes'
return 'No'
list2=[]
def Evidence(num):
list1=list(range(2,num))
for i in range(2,int(math.sqrt(num))+1):
if(is_prime(i)=='Yes'):
list2.append(i)
for i in list2:
t=2
while(True):
if (i*t)>num:
break
else:
if((i*t)in list1):
list1.remove(i*t)
t=t+1
print('[',end='')
for i in range(len(list1)):
if(i==len(list1)-1):
print(list1[i],end=']')
else:
print(list1[i],end=', ')
if __name__ == "__main__":
number = input()
Evidence(int(number))
第3关:并发编程判断大素数
任务描述
本关任务:编写一个并发程序实现对多个大素数的判断。
相关知识
为了完成本关任务,你需要掌握:1.素数判断,2.多进程并发编程。
多进程并发编程
使用concurrent.futures.ProcessPoolExecutor实现并发编程
编程要求
根据提示,在右侧编辑器补充代码, 判断是否为素数(True/False)。
测试说明
平台会对你编写的代码进行测试:
测试输入:112272535095293,112582705942171,112272535095293,115280095190773,115797848077099,1099726899285419
; 预期输出: True
True
True
True
True
False
代码实现
map 方法会返回一个map(func, *iterables)迭代器,迭代器中的回调执行返回的结果有序的。
from concurrent.futures import ProcessPoolExecutor
import math
#素性判断函数
def is_prime(num):
if num > 1:
if num == 2:
return True
if num % 2 == 0:
return False
for x in range(3, int(math.sqrt(num) + 1), 2):
if num % x == 0:
return False
return True
return False
#通过调用is_prime,设计并发函数实现对多个大素数的判断
def main():
with ProcessPoolExecutor() as executor:
for i in executor.map(is_prime, PRIMES):
print(i)
if __name__ == '__main__':
PRIMES=list(map(int,input().split(",")))
main()