题解 | #查找组成一个偶数最接近的两个素数#

查找组成一个偶数最接近的两个素数

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(nn\sqrt{n}) 空间复杂度:O(1)

全部评论

相关推荐

1 1 评论
分享
牛客网
牛客企业服务