除余法素性检测,爱拉托斯散筛法以及通过concurrent.futures.ProcessPoolExecutor并发编程判断大素数

第1关:除余法素性检测

任务描述

本关任务:编写一个能判断一个数是否是素数的程序。

相关知识

为了完成本关任务,你需要掌握:1.素数的定义。2.除余法 3.算法效率

编程要求

根据提示,在右侧编辑器补充代码,计算并输出某个数是否是素数。 评测时长限制为20秒,请注意你算法的时间效率。 要求用python3.6编程实现。

测试说明

平台会对你编写的代码进行测试:

  1. 测试输入:58; 预期输出:No
  2. 测试输入:13; 预期输出:Yes
  3. 测试输入: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编程实现

测试说明

平台会对你编写的代码进行测试:

  1. 测试输入: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]

  2. 测试输入: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()
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值