Description
哥德巴赫猜想:对于任一个大于或等于4的偶数n,至少存在一对素数p1和p2,使得n=p1+p2。 这个猜想目前既没有被证明,也没有被否定。没有人确定这个猜想是否成立。但是,如果对于给定的一个偶数,存在这样一对素数的话,人们是可以找到的。我们的要求是编写一个程序,对于给定的一个偶数,计算出存在多少对素数满足这个猜想。 在输入中给出一系列偶数。对于每一个数,程序输出存在的素数对数。注意:我们关心的是真正不同的数字对数,所以不能将(p1,p2)和(p2,p1)作为不同的两对数。
Input
每行给出一个整数。假设每个整数为偶数,并且大于或等于4,小于等于2的15次方。输入文件的结尾用0表示。
Output
每个输出行包含一个整数。不要在输出中出现其他字符。
Sample Input
6 10 12 0
Sample Output
1 2 1
AC代码:
def is_prime(n):
list = [True]*(n+1)
i = 2
while i * i <= n:
if list[i]:
j = i
while j * i <= n:
list[j*i] = False
j += 1
i += 1
return list
while True:
n = int(input())
if n == 0:
break
list = is_prime(n)
primes = []
for i in range(2,n+1):
if list[i] == True:
primes.append(i)
left = 0
right = len(primes) - 1
num = 0
while left <= right:
if (primes[left] + primes[right] == n):
num += 1
left += 1
right -= 1
elif primes[left] + primes[right] < n:
left += 1
elif primes[left] + primes[right] > n:
right -= 1
print(num)
Time Limit Exceed 代码:
def su(num):
flag = 1
for i in range(2,num):
if num % i == 0:
flag = 0
break
if flag == 1:
return True
else :
return False
while True:
n = int(input())
if n == 0:
break
count = 0
for i in range(2,int(n/2) + 1):
if su(i) == True and su(n-i) == True:
count += 1
print(count)
总结:
一开始做这题也没考虑很多,就是用的很简单的方法。然后就超时了,因为数据量很大时就崩了,暴力真的不要用。
然后就过一番学习之后,找到了新的方法(doge)。思路就是:首先建立一个数组,里面元素全部设为True,然后根据某个数是素数,但是它的倍数不是素数的原则,如果不是素数设为False。再就是用到了双指针的办法,从两端分别找满足两数之和等于n的数,满足条件记录数据,不满足继续查找。