第1关:求素数的个数
任务描述
本关任务:使用Python多进程求素数个数。
相关知识
为了完成本关任务,你需要掌握:1.多进程的使用。
编程要求
根据提示,在右侧编辑器补充代码,用多进程实现求区间[1,n]里素数的个数。 说明:求区间内素数个数是计算型密集任务,且可以将区间分成互不相关的子区间,分别使用进程对他们求解,正是多进程的用武之地!
测试说明
平台会对你编写的代码进行测试:
测试输入:5
; 预期输出: 3
测试输入:10; 预期输出:
4`
import math
from multiprocessing import cpu_count
from multiprocessing import Pool
def isPrime(n):
# 判断数字是否为素数
# 请在此处添加代码 #
# *************begin************#
if n<=1:
return False
for i in range(2,int(math.sqrt(n))+1):
if n%i == 0:
return False
return True
# **************end*************#
def howMany(T):
# 计算给定区间含有多少个素数
# 请在此处添加代码 #
# *************begin************#
sum = 0
for i in range(T[0],T[1]+1):
if isPrime(i):
sum+=1
return sum
# **************end*************#
def separateNum(N, CPU_COUNT):
# 对整个数字空间N进行分段CPU_COUNT
# 请在此处添加代码 #
# *************begin************#
list=[[i*(N//CPU_COUNT)+1,(i+1)*(N//CPU_COUNT)] for i in range(0,CPU_COUNT)]
list[0][0]=1
if list[CPU_COUNT-1][1]<N:
list[CPU_COUNT-1][1]=N
return list
# **************end*************#
if __name__ == '__main__':
N = int(input())
# 多进程
CPU_COUNT = cpu_count() ##CPU内核数 本机为8
pool = Pool(CPU_COUNT)
sepList = separateNum(N, CPU_COUNT)
result = []
for i in range(CPU_COUNT):
result.append(pool.apply_async(howMany, (sepList[i], )))
pool.close()
pool.join()
# ans = 0
list = [res.get() for res in result]
print(sum(list), end = '')
第2关:求合数的个数。
任务描述
本关任务:使用 Python 多线程,实现求合数的个数。
相关知识
为了完成本关任务,你需要掌握:1.python多线程。
编程要求
根据提示,在右侧编辑器补充代码,使用多线程计算给定区间合数的个数。 本关已给出素数判定方法,需要你补充主函数中相关内容,实现统计合数个数的相关内容。
测试说明
平台会对你编写的代码进行测试:
测试输入:5
; 预期输出: 1
测试输入:10
; 预期输出: 5
import threading
import math
ans = 0
lock = threading.Lock()
import threading
import math
ans = 0
lock = threading.Lock()
def isPrime(n):
# 判断数字是否为素数
global ans
if n <= 1:
return False
for i in range(2, int(math.sqrt(n)) + 1):
if n % i == 0:
return False
return True
def howMany(T):
# 计算给定区间含有多少个素数
sum = 0
for i in range(T[0], T[1] + 1):
if isPrime(i):
sum += 1
lock.acquire()
try:
global ans
ans += sum
finally:
lock.release()
def seprateNum(N, CPU_COUNT):
# 对整个数字空间N进行分段CPU_COUNT
list = [[i * (N // CPU_COUNT) + 1, (i + 1) * (N // CPU_COUNT)] for i in range(0, CPU_COUNT)]
list[0][0] = 1
if list[CPU_COUNT - 1][1] < N:
list[CPU_COUNT - 1][1] = N
return list
if __name__ == '__main__':
N = int(input())
threadNum = 32
# 请在此处添加代码 #
# *************begin************#
t=[]
sepList=seprateNum(N,threadNum)
for i in range(0,threadNum):
t.append(threading.Thread(target=howMany,args=(sepList[i],)))
t[i].start()
for i in range(0,threadNum):
t[i].join()
print(N-1-ans,end='')
# **************end*************#
第3关:交替打印foobarpython
任务描述
本关任务:输入一个数n,打印n个foobarpython。
相关知识
为了完成本关任务,你需要掌握:1.线程的使用,2.线程锁的使用。
编程要求
根据提示,在右侧编辑器补充代码,输出n个foobarpython。
测试说明
平台会对你编写的代码进行测试:
测试输入:1
; 预期输出: foobarpython
解释:“foobarpython”将输出1次
测试输入:5
; 预期输出: foobarpythonfoobarpythonfoobarpythonfoobarpythonfoobarpython
解释:“foobarpython”将输出5次
import threading
import sys
import time
def showfoo(n):
'''
:param n: 要输出foobarpython的次数
:return: 无返回,可直接输出
'''
# 请在此处添加代码 #
# *************begin************#
for i in range(n):
lockpython.acquire()
print('foo',end='')
sys.stdout.flush()
lockfoo.release()
time.sleep(0.2)
# **************end*************#
def showbar(n):
'''
:param n: 要输出foobarpython的次数
:return: 无返回,可直接输出
'''
# 请在此处添加代码 #
# *************begin************#
for i in range(n):
lockfoo.acquire()
print('bar',end='')
sys.stdout.flush()
lockbar.release()
time.sleep(0.2)
# **************end*************#
def showpython(n):
'''
:param n: 要输出foobarpython的次数
:return: 无返回,可直接输出
'''
# 请在此处添加代码 #
# *************begin************#
for i in range(n):
lockbar.acquire()
print('python',end='')
sys.stdout.flush()
lockpython.release()
time.sleep(0.2)
# **************end*************#
if __name__ == '__main__':
lockfoo = threading.Lock() # 定义3个互斥锁
lockbar = threading.Lock()
lockpython =threading.Lock()
n = int(input())
t1 = threading.Thread(target=showfoo,args=[n]) # 定义3个线程
t2 = threading.Thread(target=showbar,args=[n])
t3 = threading.Thread(target=showpython,args=[n])
lockfoo.acquire() # 先锁住foo,bar锁,保证先打印foo
lockbar.acquire()
t1.start()
t2.start()
t3.start()