python刷题:哥德巴赫猜想

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的数,满足条件记录数据,不满足继续查找。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值