题解 | #查找组成一个偶数最接近的两个素数#
查找组成一个偶数最接近的两个素数
http://www.nowcoder.com/practice/f8538f9ae3f1484fb137789dec6eedb9
一.枚举暴力求解 将两个数都循环确认一遍
时间复杂度O(n2)
空间复杂度O(n)
import copy
while True:
try:
n = int(input())
s_i=[]
for i in range(2,int(n/2)+1):
for j in range(2,i):
if i%j ==0:
break
else:
s_i.append(i)
s_j = copy.deepcopy(s_i)
for i in s_i:
for j in range(2,n-i):
if (n-i)%j==0:
s_j.remove(i)
break
t=max(s_j)
print(t)
print(n-t)
except:
break
二.重新求素数+中心向两边扩散的方法:
如何判断一个数是不是素数: 任意一个非素数 x=p1*p2, p1<=sqrt(x),p2>=sqrt(x)
所以我们只需要判断在sqrt(x)范围内,p1是否存在
def isPrime(x):
if x<=3:
return x>1
for i in range(2, Math.sqrt(x)+1):
if x%i ==0:
return false
else:
return true
因为 left, right 以数字中心值开始,往两边进行判断。要找到差值最小的,那么最近的找到和相等的即可:
def isPrime(num)://定义一个素数判断函数
for i in range(2,int(pow(num,0.5))+1):
if num%i==0:
return False
else:
pass
return True
def solution(left, right):
while left>=0 and right<=n-1:
if not isPrime(left) or not isPrime(right):
left-=1
right+=1
else:
print(left)
print(right)
break
while True:
try:
n=int(input())
solution(int(n/2), int(n/2))
except:
break
时间复杂度:O(n) 空间复杂度:O(1)